如何在子进程中正确接收来自键盘的标准输入?

时间:2019-02-19 07:59:46

标签: 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, b, a + b);
    }
    return 0;
}

预期的行为

$ ./program
1 2
1 + 2 = 3

实际行为

$ ./program
$ 1222245440 + 32764 = 1222278204

当我在终端中运行该程序时,该程序将很快产生诸如1222245440 + 32764 = 1222278204之类的奇怪输出,而无需等待我键入。我认为问题在于子进程的标准输入和输出流未附加到终端。而是附加了父进程的流。结果,子进程无法从键盘获取我的输入。有没有解决这个问题的方法?我的意思是,要分离父进程的流并附加子进程的流。由于某些原因,我必须在子进程中接收输入。

1 个答案:

答案 0 :(得分:1)

  

我认为问题在于子进程的标准输入和输出流未附加到终端。而是附加了父进程的流。

父进程不等待子进程,而是立即返回。孤儿无法从终端读取,“奇怪的输出”来自ab的{​​{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,然后重试。