execl调用的程序执行了多少次?
Posted
技术标签:
【中文标题】execl调用的程序执行了多少次?【英文标题】:How many times are executed the programs invoked by execl? 【发布时间】:2015-03-09 23:27:47 【问题描述】:你能帮我解决这个问题吗? execl调用的程序“exam”和“students”执行了多少次?我认为正确的答案是程序“考试”的 8 个运行时和“学生”的 0 个运行时,因为在两个第一个 fork 中将创建 3 个子进程,然后在循环中第一个 fork() 将创建更多的 4 个进程,因为已经创建的三个孩子也将运行此代码,此后我们有一个 exec 将替换创建的 7 个进程和实际程序的当前代码并运行它(程序“exam”)8 次。我的推理是否正确?
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
int main()
int i;
pid_t
pid=fork();
pid=fork();
for(i=0;i<5;i++)
pid=fork();
execlp("exam","exam",NULL);
if(pid==0)
break;
execlp("students", "students","sistcomp",NULL);
return 0;
【问题讨论】:
为什么不添加一些printf
s 并运行它?
运行一下就知道了?乍看之下,至少 1 个进程将“失败”到“学生”
@JonathonReinhart 因为这需要工作——这是 OP 希望避免的。如果你能骗到其他傻瓜为你做,为什么还要为工作而烦恼?
@MartinJames 我只是想弄清楚我的推理是否正确,您不必自大,这样的cmets是不必要的
@SérgioGomes 你的推理在我看来是正确的。
【参考方案1】:
理论上,你是对的。让我画个图来解释:
+---1 ...
|
+---+---2 ...
|
----+---+---3 ...
fork()|
+---4+---- execlp("exam","exam",NULL);
fork() |
+---- execlp("exam","exam",NULL);
^
after the first two fork()
你看,在 2 个fork()
之后,我们得到了 4 个进程。以4号为例,它进入for
循环,再次进入fork()
,那么我们这里又得到了一个子进程,这个子进程和它的父进程会执行execlp("exam","exam",NULL);
,你看这会替换当前的代码。 No.1、No.2、No.3也是如此。
因此,程序“exam”将是 8 个运行时,而“students”将是 0 个运行时。
但是,当您运行此代码时,程序“exam”的运行时间可能是 7 或 6,这可能是由 Copy-on-write 引起的(我不太确定)
PS:
像这样使用execlp
是一个好习惯:
if (pid == 0)
execlp("exam","exam",NULL);
或
if (pid != 0)
execlp("exam","exam",NULL);
【讨论】:
if (pid != 0) execlp("exam","exam",NULL);
不检查来自 fork 的错误。以上是关于execl调用的程序执行了多少次?的主要内容,如果未能解决你的问题,请参考以下文章