【问题标题】:Unix fork() system call [closed]Unix fork() 系统调用 [关闭]
【发布时间】:2023-03-14 19:50:01
【问题描述】:

祝大家白天好

我对@9​​87654321@ 感到困惑。 fork() 是分叉子进程还是只分叉父进程?

请帮忙看一些例子

#include <unistd.h>
#include <stdio.h>

int main() {
  if (fork()) {
    fork();
    printf(" X\n");
  }
  return 0;
}

这是我想如何构建流程的方式:

    parent
      |
   /    \
Parent  Child

所以输出将是

  X X X

另一个例子是

#include <unistd.h>
#include <stdio.h>

int main() {
  fork();
  fork();
  fork();

  printf(" X \n");

  return 0;
}

图表会是这样的吗?

                 Fork start
                    /     \
                Parent    Child        1st fork done output 2 of X
                /  \      /   \
              P     C    P    C        2nd fork done output 4 of X
            / \    / \  /\    /\
           P  C   P  C P  C  P  C      3rd fork done output 8 of X

另一个问题我怎么画

if (fork() || fork() || fork())
  fork();

if (fork() && fork())
  fork();

如果有人纠正我,我会很高兴。

【问题讨论】:

  • 看不懂你的图,也看不懂你的问题。一个成功的fork() 系统调用更好地理解为调用它的进程的神奇克隆。
  • fork 创建父子进程,对吧?像 pid==0 表示孩子,pid>0 表示父母,所以当我 forking() 并打印 X 并为孩子和父母打印时
  • 我建议你通过编译并在里面添加像printf("at line %d pid %d\n", __LINE__, (int)getpid()); fflush(NULL);这样的语句来尝试每个简单的例子。
  • 投票结束时“不是一个真正的问题”:询问if (fork() || fork() || fork()) fork(); 中发生的事情对“混乱”没有帮助。
  • @user1098207:我无法解析“fork 父进程”,显然你不能 fork() 创建一个已经存在的进程。父进程一般理解为首先执行fork()调用的进程。然后 两个 进程从调用中返回,这就是它的魔力。

标签: c unix fork system-calls


【解决方案1】:

fork 不会“创建父子进程”,不。它创建当前进程的副本(副本是子进程,当前进程是父进程)。区分是基于fork 返回值。

【讨论】:

  • fork();fork() 是 2 个进程的副本,对吗?那么 fork();fork();fork() 是 4 个复制进程的副本?
  • 不要写或想到fork(); fork();,而是pid_t pid1 = fork(); pid2 = fork();,你有pid1pid2的正、零、负值的九种情况
猜你喜欢
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
  • 2010-11-18
  • 2012-02-02
相关资源
最近更新 更多