在fork之后退出子进程

8

我有这段代码,它的目标是创建N个子进程并打印出每个PID和进程号。

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

void childProcess(int num)
{
    pid_t pid = fork();

    printf("Hello! I am process no. %d! my PID is %d!\n", num, pid);
}

int main()
{
    int i = 0;

    for(i = 1; i <= 5; i++)
    {
        childProcess(i);
        _exit(3);
    }
    exit(0);
}

然而,尝试多种方法后:例如使用exit_exit,childProcess中的递归,pid = wait()等等,我仍然无法只创建5个进程。目前为止我的输出是:

Hello! I am process no. 1! my PID is 96196!
Hello! I am process no. 1! my PID is 0!

我不确定如何正确退出子进程。如果没有退出,代码会创建N!个进程。


1
当您说要创建“N个子进程”时,“N”是什么?它是for循环中的迭代器值吗? - northsideknight
2个回答

11

你已经正确地退出了子进程,只是你在错误的时机这样做。在调用fork()之后,每个子进程都会像父进程一样运行相同的循环,创建另一个子进程,这就是你最终拥有许多子进程的原因。

正确的代码应该像这样:

for (int i = 0; i < 5; i++) {
  if (fork() == 0) {
    // child process
    printf("I'm child %d, my pid is %d\n", i, getpid());
    exit(0);
  }
  // parent process keeps running the loop
}

1
实际上,他只有一个,然后从子进程和父进程中都调用_exit(3)... - Alexis Wilke
exit(0)是否可以实现并行处理,例如5个子进程独立运行并在各自的时间退出? - Fahad Naeem
@FahadNaeem 不是的。每个进程只执行第一次循环迭代并命中_exit(3)。这包括主进程。因此,只有两个进程始终在运行。 主进程启动一个子进程,printf并退出。子进程printf并退出。就这些了。 - blaze

1

fork()函数将你的进程分成两个进程,一个父进程和一个子进程。你需要在childProcess()函数内部对其返回值进行某种形式的测试,以确定你是在父进程还是子进程中。如果pid为0,则表示你在子进程中;如果非零,则表示你在父进程中。基于此,你将希望有条件地退出程序。


很有趣,那么如果你不介意我问一下,当我将childProcess更改为包含if语句以仅在pid!= 0时运行时,正在打印的pid会增加1。如果那是父进程,为什么会这样呢? - TrevTS
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - John Kugelman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接