2017-09-03 5 views
1

を印刷しないと、追加のGNOMEターミナルを開き、新しくオープンした端末のコンソールで最初の20点のフィボナッチ数を印刷するように設計された私のコードです:疑似端末だからここに出力

#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ターミナルコマンドラインから実行すると、新しいターミナルがオープンポップしかし出力なしで!このコードを修正して動作させるにはどうすればよいですか?私が代わりに "gnome-terminalの" の

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

を使用する場合

は、それが正常に動作します。だから、GCCを使ってGNOME端末間でどうやって通信するのですか?

+0

tempnamを使用することとは関係ありません。 – immibis

+0

@immibis:良い点。 sprintf()関数の "xterm"に "gnome-terminal"を代入すると動作します。 – SavedbyZer0

答えて

0

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

gnone末端の男要求-eの後の文字列を試してみてください。

+0

作品**完璧な**今。ありがとうございました! – SavedbyZer0

0

コマンドラインで試してみてください。

私は

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

を実行した場合、私はその後、

xterm -e cat ~/temp 

を実行した場合、私は(私が何かを入力し、Enterキーを押しますまで、最初は空白です)catを実行している端末

を取得私はポップアップし、 "hi"を印刷し、非常に迅速に閉じるxtermを取得します。

だからgnome-terminal -e cat /some/pathcat /some/pathで実行されていませんが、catと表示されます。

あなたはgnome-terminalのでcat /some/pathを実行したい場合は、このコマンドを使用する必要があります。

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

は、余分な引用符に注意してください。

0

参考資料として、引用符を使用するか、-eの代わりに-xを使用してください。詳細については、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()error:success"を出力し、ほぼ1秒後に出力が新しいターミナルに表示されます。元のコードではこのようなエラーメッセージは生成されず、新しい端末がすぐに目的の出力をポップアップします。うーん...... – SavedbyZer0

関連する問題