c - 使用fork在c中创建n个子进程
问题描述
我在 geeks4geeks 中找到了这段代码,但我似乎无法正确理解它:
#include<stdio.h>
int main()
{
for(int i=0;i<5;i++) // loop will run n times (n=5)
{ pid_t c=fork();
if(c == 0)
{
printf("[son] pid %d from [parent] pid %d\n",getpid(),getppid());
exit(0);
}
}
for(int i=0;i<5;i++) // loop will run n times (n=5)
wait(NULL);
}
此代码从父进程创建 5 个进程并打印来自每个子进程的消息。我的问题是:由于我们没有对 c 使用任何限制,例如父进程和第一个子进程都执行的第二个 fork 不是吗?没有在父亲的代码中隔离 fork 这段代码如何不创建 2^5 个子进程?for 循环是否以某种方式阻止了这种情况的发生?
解决方案
子进程不会调用fork
,因为它们在此之前退出:
for(int i=0;i<5;i++)
{
pid_t c=fork();
if(c == 0) // fork returns 0 to the child process so it enters "if" block
{
printf("[son] pid %d from [parent] pid %d\n",getpid(),getppid());
// child exits
exit(0);
}
}
如果if
块不包含exit
,那么是的,每个孩子都会迭代回到循环的顶部,并可能fork
再次迭代。但是由于每个子进程只在打印初始父进程调用后立即退出fork
,所以您只创建 5 个进程。
推荐阅读
- python - 如何在python中附加来自不同数据框的数据?
- mongodb - $elemMatch 最后一个元素而不是第一个
- node.js - 你能在 find() 之后更新 then() 回调中返回的行吗?
- android - 在 Android XML 布局中,我可以使用子视图或视图组来着色父背景的一部分吗?
- python-3.x - 在 python 中将 pandas.core.frame.DataFrame 转换为 pandas 数据帧
- php - Laravel 容器返回多个 Singleton 实例
- beautifulsoup - 如何访问父节点中的子节点
- python - LSTM 模型的 ROC 曲线
- php - 使用 ON DUPLICATE KEY UPDATE 将 PHP 多维数组插入 Mysql 数据库
- mysql - AWS lightail ubuntu 18.04服务器上的Docker mysql 5.7不断重启