伪终端不打印输出
Pseudo-terminal not printing output
下面是我的代码,旨在打开一个额外的 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 终端命令行执行它时,新终端弹出,但 没有输出! 我如何修复此代码以使其工作?
当我使用
sprintf(cmd, "xterm -e cat %s", name);
而不是 "gnome-terminal",它工作正常。那么如何使用 GCC 在 gnome 终端之间进行通信呢?
在命令行中尝试。
如果我运行
echo hi > ~/temp
gnome-terminal -e cat ~/temp
然后我得到一个终端 运行ning cat
(最初是空白的,直到我输入一些东西并按回车键)
如果我运行
xterm -e cat ~/temp
然后我得到一个弹出的 xterm,打印 "hi" 并很快关闭。
看来 gnome-terminal -e cat /some/path
不是 运行宁 cat /some/path
而只是 cat
.
如果你想在 gnome 终端中 运行 cat /some/path
那么你必须使用命令:
gnome-terminal -e "cat /some/path"
注意多余的引号。
要么按照 immibis 的建议使用引号,要么使用 -x
而不是 -e
。有关详细信息,请参阅 gnome-terminal
的联机帮助页。
你的分叉机制有一个额外的问题:
if (fork() == 0) {
/* do something in the child */
} else
if (fork() < 0) { //<--- fork AGAIN!
perror("fork () error");
}
父进程fork了两次!
您应该改为存储 pid:
int pid = fork();
if (pid == 0) {
/* do something in the child */
} else
if (pid < 0) {
perror("fork () error");
}
尝试
sprintf(cmd, "gnome-terminal -e \"cat %s\"", name);
gnone-terminal 的 man 在 -e 之后请求一个字符串。
下面是我的代码,旨在打开一个额外的 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 终端命令行执行它时,新终端弹出,但 没有输出! 我如何修复此代码以使其工作?
当我使用
sprintf(cmd, "xterm -e cat %s", name);
而不是 "gnome-terminal",它工作正常。那么如何使用 GCC 在 gnome 终端之间进行通信呢?
在命令行中尝试。
如果我运行
echo hi > ~/temp
gnome-terminal -e cat ~/temp
然后我得到一个终端 运行ning cat
(最初是空白的,直到我输入一些东西并按回车键)
如果我运行
xterm -e cat ~/temp
然后我得到一个弹出的 xterm,打印 "hi" 并很快关闭。
看来 gnome-terminal -e cat /some/path
不是 运行宁 cat /some/path
而只是 cat
.
如果你想在 gnome 终端中 运行 cat /some/path
那么你必须使用命令:
gnome-terminal -e "cat /some/path"
注意多余的引号。
要么按照 immibis 的建议使用引号,要么使用 -x
而不是 -e
。有关详细信息,请参阅 gnome-terminal
的联机帮助页。
你的分叉机制有一个额外的问题:
if (fork() == 0) {
/* do something in the child */
} else
if (fork() < 0) { //<--- fork AGAIN!
perror("fork () error");
}
父进程fork了两次!
您应该改为存储 pid:
int pid = fork();
if (pid == 0) {
/* do something in the child */
} else
if (pid < 0) {
perror("fork () error");
}
尝试
sprintf(cmd, "gnome-terminal -e \"cat %s\"", name);
gnone-terminal 的 man 在 -e 之后请求一个字符串。