【问题标题】:something about process schedule by OS?关于操作系统的进程计划?
【发布时间】:2012-04-09 08:23:02
【问题描述】:

我编写以下代码并在我的linux中运行。每次fork后终端打印两个PID,这表明两个进程都由操作系统调度,然后是“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());
}

【问题讨论】:

  • 您正在将测试用例分组在一起,以确定您是否在父进程和子进程中。 fork()将子进程的PID返回给父进程(>0),fork()将0返回给子进程。

标签: c process io operating-system fork


【解决方案1】:

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

【讨论】:

  • 无论我输入多少次数据并按回车键,我都会在终端上打印相同的PID
  • @venus.w 您看到相同的 PID 只是巧合。在我的电脑上,我可以看到两个 PID 的比例几乎相等。做一件事。不要输入scanf 的数字,而是输入char 并按ENTER。 scanf 会发疯,PID 将在一个进程中无限打印。再输入一个char 并按回车。现在你会看到两个 PID 都在无限地移动
  • 我在 ubuntu 上运行我的程序,你的操作系统是什么,可能取决于操作系统。
  • 即使我在 Ubuntu 11.10 上。操作系统应该无关紧要。您是否按照我的建议尝试输入字符而不是数字?
【解决方案2】:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
  • 2018-06-23
  • 1970-01-01
  • 2014-06-20
  • 2011-10-31
  • 2011-08-11
  • 1970-01-01
相关资源
最近更新 更多