2012-04-03 71 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作爲尾部。

這增加了保存日誌輸出進行審查,即使終端崩潰被殺害/效益。

相關問題