Fork进程后,是否与父进程共享stdio?

2023-10-18 10:50:17 浏览数 (3)

今天想到一个问题:如果我在代码里面,fork当前进程,然后两个进程都执行scanf(),那会发生什么?键盘输入的数据是定向到哪个进程呢?

于是简单写了一段代码进行测试:

代码语言:javascript复制
#include<stdio.h>
#include<unistd.h>

void child_process(){
    while(1){
        char c;
        scanf("%cn", &c);
        printf("child process: %cn", c);
    }

}
int main()
{
    printf("running...n");

    int child_pid = fork();
    if (child_pid == 0)
        child_process();
    else
    {
        printf("parent process, child=%dn", child_pid);
        while (1)
        {
            char c;
            scanf("%cn", &c);
            printf("parent process: %cn", c);
        }
    }
}

根据上面这串代码,父进程和子进程都会调用scanf,并打印自己读取到的数据。运行之后,当我在控制台输入字符,输出如下:

代码语言:javascript复制
running...
parent process, child=33781

2
parent process: 2
parent process: 

3
child process: 3
child process: 

4
parent process: 4
parent process: 

5
parent process: 5
parent process: 

2
child process: 2
child process: 

3
parent process: 3
parent process: 

4
child process: 4
child process: 

5
parent process: 5
parent process: 

6
child process: 6
child process: 

可以看到,父进程和子进程都读取了键盘的数据。具体是哪一个进程获取到数据,则与进程调度有关。这提醒了我一点:多个进程同时读取同一个stdin的话,会造成获取到的数据不完整的问题。(这与stdin默认为tty这样的字节设备的特性有关)

0 人点赞