【问题标题】:multiple fork() in c programc程序中的多个fork()
【发布时间】:2017-09-05 17:09:39
【问题描述】:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
    pid_t pid1, pid2, pid3, pid4;
    pid1=fork();

    if (pid1!=0) {
        pid2=fork();
        pid3=fork(); 
    }else { 
        pid4=fork(); 
    } 
    return 0;
}

你好, 以下代码执行 4 个分叉。首先,原始进程(我们称之为 P0)执行“pid1=fork()”并创建一个子进程(我们称之为 P1)。然后原始进程再次执行 pid2=fork() 并创建另一个子进程(我们称之为 P2)。然后 P2 和 P0 都执行“pid3=fork()”。因此,P0 创建了第三个孩子(称为 P3),P2 成为父母并创建了一个孩子(称为 P4)。最后,在 else 语句中,第一个孩子(P1)创建了一个孩子(P5)。所以树就像:

                  P0
              P1   P2   P3
            P5      P4

我的问题是:我对不对? 提前致谢。

【问题讨论】:

  • 使用您的调试器和/或添加一些调试程序printfs 并自己检查 - 这样您会学到很多东西。
  • 不是 pid2=fork();返回两次(父母和孩子),所以 pid3=fork90;将执行两次。
  • @DavidZimmerman 是的,这就是提问者所说的以及为什么他的树形图中的数字上升到 5。
  • 应该有两个 P3,一个用于 pid2=fork() 的每一侧

标签: c linux process fork


【解决方案1】:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
pid_t pid1, pid2, pid3, pid4;
printf("PID=%d, PPID=%d.\n", getpid(), getppid());
pid1=fork();

if (pid1!=0) {
 pid2=fork();
 printf("PID=%d, PPID=%d.\n", getpid(), getppid());
 pid3=fork(); 
 printf("PID=%d, PPID=%d.\n", getpid(), getppid());
}else { 
  pid4=fork();
  printf("PID=%d, PPID=%d.\n", getpid(), getppid()); } 
return 0;
}

我添加了一些 printfs 并打印了进程 ID 和父进程 ID,但每个人都有相同的父进程。是不是因为原流程先完成?我得到this output

【讨论】:

  • 确实它们是 6 个不同的进程,但它们的父进程并不像我上面描述的那样
【解决方案2】:

我的问题是:我对吗?

是的。

正如 Paul R 在 cmets 中所说,尝试放入一些 printf。例如在

之后
pid1 = fork()

试试看

printf("pid %d: pid1 = fork(), result = %d\n", getpid(), pid1);

getpid()获取当前进程的pid。

【讨论】:

  • 使用getppid() 也可能会有所帮助。
猜你喜欢
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-29
  • 1970-01-01
  • 2016-09-16
  • 1970-01-01
相关资源
最近更新 更多