【问题标题】:Find the number of processes when forking分叉时查找进程数
【发布时间】:2015-02-10 04:35:11
【问题描述】:

我正在阅读这本操作系统书籍,他们正在讨论 UNIX 机器中的分叉。我知道fork() 是一个系统调用,它创建了一个进程的副本(一个父母和一个孩子)。假设有以下代码:

1 int main(){
2  pid = fork ();
3  if (pid !=0)
4     fork();
5  fork();

当 PID 为 0 时,我们在子进程中,如果不是,那么我们在父进程中,对吗?所以上面的代码执行如下(在第 2 行时):

    P0
    /\
   P0 P1

由于 P1 不是 0,所以我们执行第 4 行 - 然后我们执行第 5 行,这意味着 P0 被分叉了

    P0
  /    \
 P0     P1
 /\    /  \
P0 P2  P1 P3

所以创建的进程总数是:P0、P1、P2、P3、4 个进程?这本书说这是六个过程,但没有说明这是如何完成的。

谢谢

更新:这不是作业问题,因为我已经说过结果应该是 6 个过程,我只是不明白这本书是如何得到这个答案的

【问题讨论】:

  • 该代码有 3 个分叉行。尝试在绘图中标记行号。
  • @hyde 我在我的画中分叉了 3 次,对吗?
  • 好吧,显然不正确,因为当正确结果为 6 时,您的绘图中最终会出现 4 个进程(据我所知,这确实是正确的)

标签: unix fork system-calls


【解决方案1】:

您的代码应该创建总共 6 个进程。

  • 主进程(例如 PM)将执行第 1 行到第 5 行的代码,其中包括 2 个 fork(@line 2 和 5),因此会生成两个子进程,例如 PC1 和 PC2
    {fork @line 4 将仅执行由子进程而不是由主进程}
  • 在第 2 行创建的子进程(例如 PC1)执行从第 3 行到第 5 行的代码,其中包括 2 个分叉(@第 4 和 5 行)因此生成两个子进程,例如 PCC1 和 PCC2
  • 在第 4 行创建的子进程(例如 PCC1)在第 5 行执行代码,这是 fork,因此再生成一个子进程,例如 PCCC1


总共 6 个进程 = PM + PC1 + PC2 + PCC1 + PCC2 + PCCC1


绘画:

下午 / \ 个人电脑1个人电脑2 (@2) (@5) / \
PCC1 PCC2 (@4) (@5) / PCCC1 (@5)
注意:由于只有 if 语句(没有 if-else),所以 fork @line 5 将被主进程和两个子进程调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 2011-06-24
    • 2012-04-22
    • 2010-11-07
    • 1970-01-01
    • 2017-01-28
    相关资源
    最近更新 更多