Linux 如何在子进程中正确接收键盘的标准输入?
我在Linux上运行以下C程序 节目Linux 如何在子进程中正确接收键盘的标准输入?,linux,bash,terminal,c,Linux,Bash,Terminal,C,我在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,
// 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
,并且不会等待我输入。有没有办法解决这个问题
我认为问题在于子进程的标准输入和输出流没有连接到终端。相反,父进程的流是附加的
父进程不等待子进程,而是立即返回。孤儿无法从终端读取,“奇怪输出”来自a
和b
。查看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;
}
#包括
#包括
#包括
int main(){
int wstatus;
如果(fork()==0){//子进程
int a,b,n;
n=scanf(“%d%d”、&a和&b);
printf((%d返回)%d+%d=%d\n“,n,a,b,a+b);
}
//等待(&wstatus);
返回0;
}
您很可能会得到类似于(-1 returned)1222245440+32764=1222278204
的结果。然后取消注释等待
并重试