以下是接近你想要的!它仍然有一些缺陷:
- 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