今天想到一个问题:如果我在代码里面,fork当前进程,然后两个进程都执行scanf(),那会发生什么?键盘输入的数据是定向到哪个进程呢?
于是简单写了一段代码进行测试:
#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,并打印自己读取到的数据。运行之后,当我在控制台输入字符,输出如下:
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这样的字节设备的特性有关)
转载请注明来源:https://longjin666.cn/?p=1715
欢迎关注我的公众号“灯珑”,让我们一起了解更多的事物~