分叉后退出子进程
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 _exi
t、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!进程。
【问题讨论】:
当你说你试图创建'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。以上是关于分叉后退出子进程的主要内容,如果未能解决你的问题,请参考以下文章