2012-04-03 72 views
4

我的节目(在Solaris 10 C++)经由wcout当它从一个壳开始将输出写入到它的终端。但是,当我在Sun Studio中执行它时,或者文件管理器没有终端,并且输出显示在Sun Studio输出窗口中或根本没有。的Unix/C++:打开新终端和输出重定向到其

我想它在任何三种情况开设自己的终端窗口并连接wcout这个终端窗口。我希望通过C++系统调用来完成程序本身,而不是通过某种外壳或脚本执行程序的方式。因为在Studio IDE中执行并在文件管理器中双击将仍然具有相同的效果。

作为一个Windows程序员,似乎很自然的我,但我不能找出如何,这是在我的Unix的书籍,也没有在网上完成的。我是否在要求错误的事情,是否真的很难做,或者我错过了什么?

+0

“我是请求错误的事情?” - 有点。命令行工具通常不会创建像终端一样的图形实体。一般来说,他们依靠一些较高/以前的实体为他们创建它。这样一来,它们在SunStudio控制台,xterm,gnome-terminal,纸质终端等上都可以很好地工作。我对Solaris文件管理器不熟悉,但我敢打赌它具有用于自己运行程序的功能终奌站。 – 2012-04-03 16:17:06

+0

我不确定这是否相关,但它不是命令行工具。该程序是与其他几台服务器一起运行的服务器,用于构建应用程序。稍后,它将通过一些复杂的远程启动机制启动,我希望它在终端中显示状态信息以用于测试目的。 – 2012-04-03 17:12:10

+0

感谢Arkadiy和celtschk。两者皆为+1。我接受那个恰恰回应我的问题。但是我也会检查这个简单的方法是否更适合Unix的做事方式。 – 2012-04-04 08:23:50

回答

5

以下是接近你想要的!它仍然有一些缺陷:

  • xterm不能正常关闭(它会在程序终止时关闭)。我不知道为什么这样。
  • 在预期输出之前输出一个数字。再次,我不知道为什么。
  • 我似乎无法重定向输入。

也许别人知道如何修复这些错误(以及其他我可能没有注意到的错误)。

#include <stdlib.h> 
#include <fcntl.h> 
#include <string.h> 
#include <unistd.h> 
#include <iostream> 
#include <sstream> 

int main() 
{ 
    int pt = posix_openpt(O_RDWR); 
    if (pt == -1) 
    { 
    std::cerr << "Could not open pseudo terminal.\n"; 
    return EXIT_FAILURE; 
    } 
    char* ptname = ptsname(pt); 
    if (!ptname) 
    { 
    std::cerr << "Could not get pseudo terminal device name.\n"; 
    close(pt); 
    return EXIT_FAILURE; 
    } 

    if (unlockpt(pt) == -1) 
    { 
    std::cerr << "Could not get pseudo terminal device name.\n"; 
    close(pt); 
    return EXIT_FAILURE; 
    } 

    std::ostringstream oss; 
    oss << "xterm -S" << (strrchr(ptname, '/')+1) << "/" << pt << " &"; 
    system(oss.str().c_str()); 

    int xterm_fd = open(ptname,O_RDWR); 
    char c; 
    do read(xterm_fd, &c, 1); while (c!='\n'); 

    if (dup2(pt, 1) <0) 
    { 
    std::cerr << "Could not redirect standard output.\n"; 
    close(pt); 
    return EXIT_FAILURE; 
    } 
    if (dup2(pt, 2) <0) 
    { 
    std::cerr << "Could not redirect standard error output.\n"; 
    close(pt); 
    return EXIT_FAILURE; 
    } 

    std::cout << "This should appear on the xterm." << std::endl; 
    std::cerr << "So should this.\n"; 
    std::cin.ignore(1); 

    close(pt); 
    return EXIT_SUCCESS; 
} 
0

当您调用程序时,而不是运行:myprog 1 2 3 a b c,请运行xterm -e myprog 1 2 3 a b c

+0

这是我的Google研究给我带来的。但就像我说的,我想从程序中完成而不是从通话中完成。 – 2012-04-03 15:53:14

0

我会recommnend创建一个运行到你通过程序来执行的终端shell脚本,那么你应该调用从文件管理器程序的那个脚本来代替。

你script.sh:

#/ bin/sh的

的xterm -e/path_to_your_program/your_program

3

你要输出到文件(重定向,使用日志API或接近标准输出/重新打开它作为一个文件)。然后在您选择的终端中使用tail -f作为尾部。

这增加了保存日志输出进行审查,即使终端崩溃被杀害/效益。

相关问题