我编写以下代码并在我的linux中运行。在fork之后,终端打印两个PID,显示两个进程都由OS调度,然后是“scanf”执行的时间,两个进程都被阻止等待输入。但是每次我输入一个数字,然后我在终端上打印相同的PID。 是否意味着当终端IO遇到或发生其他事情时,操作系统会调用相同的进程?
int main(int argc, char* argv[])
{
int num;
if(fork() >= 0)
{
printf("%x\n",getpid());
while(1)
{
if(scanf("%d",&num) != EOF)
{
printf("%x\n",getpid());
}
}
}
printf("\nit is over:%x\n", getpid());
}
答案 0 :(得分:1)
正如Hunter McMillen在评论中已经指出的那样,您正在为父母和孩子分组案例。现在它们都按照输出的PID
个不同的{1}}进行了安排,现在它们都在scanf
等待。输入数据后,您只看到一个PID
,因为您输入的输入是一个进程的一部分。 其他流程(可以是父母或孩子)仍在等待您输入。现在,即使您的终端被单个PID
淹没,由一个进程连续输出,请尝试再次输入一些数据并按Enter键。现在你可以看到两个PID
被打印了!
答案 1 :(得分:0)
这是因为,在if()语句中,fork()创建子进程并在无限循环中运行。有一个父进程的概念,使用fork()系统调用创建的子进程的父进程。 if()结束后的语句属于父进程,在这里,只有在子进程结束后才会执行。这就是为什么你得到相同的进程ID,即子进程。