有关OS的流程安排的事情吗?

时间:2012-03-25 16:27:42

标签: c process io operating-system fork

我编写以下代码并在我的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());
}

2 个答案:

答案 0 :(得分:1)

正如Hunter McMillen在评论中已经指出的那样,您正在为父母和孩子分组案例。现在它们都按照输出的PID个不同的{1}}进行了安排,现在它们都在scanf等待。输入数据后,您只看到一个PID,因为您输入的输入是一个进程的一部分。 其他流程(可以是父母或孩子)仍在等待您输入。现在,即使您的终端被单个PID淹没,由一个进程连续输出,请尝试再次输入一些数据并按Enter键。现在你可以看到两个PID被打印了!

答案 1 :(得分:0)

这是因为,在if()语句中,fork()创建子进程并在无限循环中运行。有一个父进程的概念,使用fork()系统调用创建的子进程的父进程。 if()结束后的语句属于父进程,在这里,只有在子进程结束后才会执行。这就是为什么你得到相同的进程ID,即子进程。