前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Fork进程后,是否与父进程共享stdio?

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

作者头像
灯珑LoGin
发布2023-10-18 10:50:17
1320
发布2023-10-18 10:50:17
举报
文章被收录于专栏:龙进的专栏龙进的专栏

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

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

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

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

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

    int child_pid = fork();
    if (child_pid == 0)
        child_process();
    else
    {
        printf("parent process, child=%d\n", child_pid);
        while (1)
        {
            char c;
            scanf("%c\n", &c);
            printf("parent process: %c\n", 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这样的字节设备的特性有关)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023年3月20日2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档