我正在Linux上运行以下C程序。
程序
// program.c
#include <stdio.h>
#include <unistd.h>
int main() {
if (fork() == 0) { // child process
int a, b;
scanf("%d %d", &a, &b);
printf("%d + %d = %d\n", a, b, a + b);
}
return 0;
}
预期的行为
$ ./program
1 2
1 + 2 = 3
实际行为
$ ./program
$ 1222245440 + 32764 = 1222278204
当我在终端中运行该程序时,该程序将很快产生诸如1222245440 + 32764 = 1222278204
之类的奇怪输出,而无需等待我键入。我认为问题在于子进程的标准输入和输出流未附加到终端。而是附加了父进程的流。结果,子进程无法从键盘获取我的输入。有没有解决这个问题的方法?我的意思是,要分离父进程的流并附加子进程的流。由于某些原因,我必须在子进程中接收输入。
答案 0 :(得分:1)
我认为问题在于子进程的标准输入和输出流未附加到终端。而是附加了父进程的流。
父进程不等待子进程,而是立即返回。孤儿无法从终端读取,“奇怪的输出”来自a
和b
的{{3}}。查看scanf
返回的内容,运行以下代码:
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
int wstatus;
if (fork() == 0) { // child process
int a, b, n;
n=scanf("%d %d", &a, &b);
printf("(%d returned) %d + %d = %d\n", n, a, b, a + b);
}
// wait(&wstatus);
return 0;
}
您很可能会得到类似(-1 returned) 1222245440 + 32764 = 1222278204
的信息。然后取消注释wait
,然后重试。