2017-09-03 129 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