2016-09-19 32 views
0

昨天,我接受了一次采访,并被问及使用fork()的代码片段的这个问题。有多少个进程?

void main() 
{............ 
for (int k=1;k<=10;k++) 
{ 
pid[k]=fork(); 
if(!pid[k]) 
execvp(.....); 
} 
} 

根据我的了解,我对总共1024个过程将在那里包括父为2^N -1 = 1023 + 1父,其中n =总叉

不过,面试官回答说,我的答案是错的。

我的理解有什么问题?

+0

这个程序是由execvp执行的这个程序,还是相关的东西?这也可能有助于知道为什么你认为1024是正确答案(即解释你的推理) – fvu

+0

我认为孩子被不同的程序取代。 – Garrick

+0

那么,在这种情况下,子进程将不会参与进一步的分叉,这将导致10个孩子和1个父母,否?另外,2^10-1绝对不是1024 ... – fvu

回答

1

鉴于此代码

pid[k]=fork(); 
if(!pid[k]) 
    execvp(.....); 

和阅读the man page of fork其中指出

成功时,子进程的PID在父返回, 和0的孩子返回。

我们知道子进程将执行exec调用(并继续执行不同的程序),而父进程将循环并创建另一个子进程。

这意味着将为循环的每次迭代创建一个孩子,在这种情况下将会创建一个孩子10次。所以,答案是10个孩子+ 1个父= 11


现在,如果得到通过EXEC启动的程序是一样的节目,乐趣只会在计算机的内存耗尽时停止:在每次迭代10个项目每个将创建10个孩子,每个孩子将创建10个孩子,等等。 fork()的一个特性是父母和孩子获得了相同变量的图像(这会导致可预测的孩子数量,即某个与2的幂相关的数字),显然,当程序获得时,这是不正确的exec'd,这意味着可用内存将是唯一的限制。

+0

如果execvp()加载相同的程序,那么? – Garrick