昨天,我接受了一次采访,并被问及使用fork()的代码片段的这个问题。有多少个进程?
void main()
{............
for (int k=1;k<=10;k++)
{
pid[k]=fork();
if(!pid[k])
execvp(.....);
}
}
根据我的了解,我对总共1024个过程将在那里包括父为2^N -1 = 1023 + 1父,其中n =总叉
不过,面试官回答说,我的答案是错的。
我的理解有什么问题?
昨天,我接受了一次采访,并被问及使用fork()的代码片段的这个问题。有多少个进程?
void main()
{............
for (int k=1;k<=10;k++)
{
pid[k]=fork();
if(!pid[k])
execvp(.....);
}
}
根据我的了解,我对总共1024个过程将在那里包括父为2^N -1 = 1023 + 1父,其中n =总叉
不过,面试官回答说,我的答案是错的。
我的理解有什么问题?
鉴于此代码
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,这意味着可用内存将是唯一的限制。
如果execvp()加载相同的程序,那么? – Garrick
这个程序是由execvp执行的这个程序,还是相关的东西?这也可能有助于知道为什么你认为1024是正确答案(即解释你的推理) – fvu
我认为孩子被不同的程序取代。 – Garrick
那么,在这种情况下,子进程将不会参与进一步的分叉,这将导致10个孩子和1个父母,否?另外,2^10-1绝对不是1024 ... – fvu