关于连续使用fork()到底产生多少个子进程问题的实践

本文探讨了在连续使用fork()时产生的子进程数量及其行为。通过实验,作者发现了一个额外的子进程(3522)并解释了其产生原因,涉及到Linux的内存共享映射和写时复制(Copy-on-Write)机制。文章分析了各进程的child_process变量,揭示了输出语句执行的顺序和原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于连续使用fork()到底产生多少个子进程问题的实践

原问题来自网上的提问,近来也有不少相关的IT公司笔试题要求在使用fork()多次的情况下写出输出某个字符串的次数。针对这个问题,不少网友有不同的看法。我对于这个问题的探究主要放在fork()到底产生多少个子进程这个问题上。

实验环境:64-Ubuntu/Linuxversion 3.13.0-37-generic/gcc version 4.8.2

以下代码用于在连续fork()两次的程序中跟踪当前进程ID(getpid())、当前进程的父进程ID(getppid())、当前进程中的变量child_process1与child_process2。


   从运行结果来看,主父进程ID为3519、第一个子进程ID为3520、第二个子进程ID为3521,还有一个进程ID为3522的进程居然还输出了两行结果。

   从运行过程来看主父进程(3519)从头执行到尾,在“almostend”的时候进入等待(等待两个子进程结束)。接着是主父进程的第二个子进程(3521)开始执行(为什么不是第一个子进程先执行到输出语句,这个跟进程调度有关),然后第二个子进程一直执行到“end”结束。再下来就是第一个子进程(3520)执行,执行到“almost end”的时候停住了,蹦出来一个子进程(3522)执行了两次输出,接着这个进程结束。再下来就是第一个子进程跟主父进程依次结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值