2017-09-03 133 views
1

因此,這裏是我的代碼,其目的是打開一個額外的GNOME終端,並在新打開的終端控制檯打印頭20支Fibonacci數:僞終端不打印輸出

#include <stdio.h> 
#include "apue.h" 

int Fibonacci(unsigned int n); 

int main() { 
    char cmd[256]; 
    char str[40][256]; 
    char *name = tempnam(NULL, NULL); 
    char *line = "\n"; 
    FILE *log; 

    mkfifo(name, 0777); 
    log = fopen(name, "w+"); 

    for (unsigned int i = 0; i < 20; i++) { 
     sprintf(str[(2 * i)], "%s",line); 
     fputs(str[(2 * i)], log); 
     sprintf(str[(2 * i) + 1], "%u\n", Fibonacci(i)); 
     fputs(str[(2 * i) + 1], log); 
     fflush(NULL); 
    } 
    if (fork() == 0) { 
     sprintf(cmd, "gnome-terminal -e cat %s", name); 
     system(cmd);  
     for (unsigned int j = 0; j < 40 ; j++) {  
      fgets(str[j], sizeof(cmd), log);    
     } 
     exit(0); 
    } else 
    if (fork() < 0) { 
     perror("fork() error");  
    } 
} 

int Fibonacci(unsigned int n) { 
    if (n == 0) { 
     return 0; 
    } else 
    if (n == 1) { 
     return 1; 
    } else 
    if (n > 1) { 
     return Fibonacci(n - 2) + Fibonacci(n - 1); 
    } 
} 

當我編譯它,我得到以下警告消息:

-*- mode: compilation; default-directory: "/usr/lib/gcc/x86_64-linux-gnu/4.8.4/include/" -*- 
Compilation started at Sun Sep 3 15:46:28 

gcc -o FIB0 Fibonacci.c 
/tmp/ccobnJV9.o: In function `main': 
Fibonacci.c:(.text+0x231f): warning: the use of `tempnam' is dangerous, better use `mkstemp' 

Compilation finished at Sun Sep 3 15:46:28 

當我從GNOME終端命令行執行它,新的終端彈開但沒有輸出!我該如何修復此代碼才能使其工作?

當我使用

sprintf(cmd, "xterm -e cat %s", name); 

,而不是 「的gnome-terminal」,它工作正常。那麼如何使用GCC在gnome終端之間進行通信?

+0

這與使用tempnam沒有任何關係。 – immibis

+0

@immibis:好點。它在sprintf()函數中將「gnome-terminal」替換爲「xterm」時有效。 – SavedbyZer0

回答

0

嘗試

sprintf(cmd, "gnome-terminal -e \"cat %s\"", name); 

gnone端的人的請求後-e一個字符串。

+0

作品**完美**現在。謝謝! – SavedbyZer0

0

在命令行中試用它。

如果我運行

echo hi > ~/temp 
gnome-terminal -e cat ~/temp 

然後我得到運行cat終端(其最初是空白的,直到我輸入一些東西,然後按回車)

如果我運行

xterm -e cat ~/temp 

然後我得到一個彈出的xterm,打印「嗨」並非常快地關閉。

所以它看起來gnome-terminal -e cat /some/path沒有運行cat /some/path但只有cat

如果你想運行在Gnome終端cat /some/path那麼你必須使用命令:

gnome-terminal -e "cat /some/path" 

注意額外的引號。

0

可以使用建議的移民報價,或者使用-x而不是-e。有關詳細信息,請參閱gnome-terminal的聯機幫助頁。

1

。在你的分流機制,一個額外的問題:

if (fork() == 0) { 
    /* do something in the child */ 
} else 
if (fork() < 0) { //<--- fork AGAIN! 
    perror("fork() error");  
} 

父進程分叉兩次!

而應該存儲PID:

int pid = fork(); 
if (pid == 0) { 
    /* do something in the child */ 
} else 
if (pid < 0) { 
    perror("fork() error");  
} 
+0

當我通過調用fork()一次來實現您的更改時,發生的第一件事是主終端打印出「fork()錯誤:成功」,並且在幾乎1秒的延遲後,輸出顯示在新終端中。而原始代碼不產生這樣的錯誤信息,新的終端立即彈出所需的輸出。嗯...... – SavedbyZer0