以下是接近你想要的!它仍然有一些缺陷:
- 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;
}
“我是请求错误的事情?” - 有点。命令行工具通常不会创建像终端一样的图形实体。一般来说,他们依靠一些较高/以前的实体为他们创建它。这样一来,它们在SunStudio控制台,xterm,gnome-terminal,纸质终端等上都可以很好地工作。我对Solaris文件管理器不熟悉,但我敢打赌它具有用于自己运行程序的功能终奌站。 – 2012-04-03 16:17:06
我不确定这是否相关,但它不是命令行工具。该程序是与其他几台服务器一起运行的服务器,用于构建应用程序。稍后,它将通过一些复杂的远程启动机制启动,我希望它在终端中显示状态信息以用于测试目的。 – 2012-04-03 17:12:10
感谢Arkadiy和celtschk。两者皆为+1。我接受那个恰恰回应我的问题。但是我也会检查这个简单的方法是否更适合Unix的做事方式。 – 2012-04-04 08:23:50