分叉后退出子进程

Posted

技术标签:

【中文标题】分叉后退出子进程【英文标题】:Exit a child process after forking 【发布时间】:2015-12-12 08:30:26 【问题描述】:

我有这段代码,它的目标是创建 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 vs _exit、childProcesspid = wait() 中的递归,我仍然无法仅创建 5 个进程。到目前为止,使用此代码,我的输出是:

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

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

【问题讨论】:

当你说你试图创建'N个子进程'时,'N'是什么?是for循环中的迭代器值吗? 【参考方案1】:

您正确地退出了子进程,只是您在错误的时间这样做。在 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

【讨论】:

实际上,他只有其中一个,然后他从孩子和父母双方都拨打_exit(3)... exit(0) 是否实现了并行处理,即 5 个孩子独立运行并在自己的时间退出? @FahadNaeem 没有。每个进程只执行第一次循环迭代并点击_exit(3)。这包括主要过程。所以只有两个进程在运行。主进程启动一个子进程,printfs 并退出。子进程 printfs 并退出。就是这样。【参考方案2】:

fork() 将您的进程分成两个进程,一个父进程和一个子进程。您需要在childProcess() 中对其返回值进行某种测试,以确定您是在父母中还是在孩子中。如果pid 为 0,那么您在孩子中;如果非零,那么你在父母中。基于此,您需要有条件地退出程序。

【讨论】:

这很有趣,所以如果你不介意我问,每当我更改我的 childProcess 以包含一个 if 语句以仅在 pid != 0 时运行,正在打印的 pid 增加 1 . 如果那是父母,为什么会这样? fork()的返回值是多少?检查文档。不是当前进程的PID。

以上是关于分叉后退出子进程的主要内容,如果未能解决你的问题,请参考以下文章

分叉后退出子进程

golang 热重启

Linux学习-进程管理

Shell脚本入门 07:进程与信号

Shell脚本入门 07:进程与信号

38父进程子进程进程组作业和会话