你能帮我解决这个问题吗? execl调用的程序“考试”和“学生”执行了多少次?我认为正确答案是程序“考试”的8个运行时和“学生”的0个运行时,因为在两个第一个分支中将创建3个子进程,在循环之后第一个fork()将创建更多4个进程,因为已创建的三个子项也将运行此代码,此后我们有一个exec将替换创建的7个进程的当前代码和实际程序并运行它(程序“考试”)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;
}
答案 0 :(得分:1)
理论上,你是对的。让我画一个图来解释:
+---1 ...
|
+---+---2 ...
|
----+---+---3 ...
fork()|
+---4+---- execlp("exam","exam",NULL);
fork() |
+---- execlp("exam","exam",NULL);
^
after the first two fork()
你看,在2 fork()
之后,我们得到了4个进程。以No.4为例,它再次输入for
循环和fork()
,然后我们在这里获得另一个子进程,这个子进程及其父进程将execlp("exam","exam",NULL);
执行,如您所见将替换当前的代码.1号,2号和3号也是如此。
因此,程序“考试”将为8个运行时,“学生”为0个。
但是,当您运行此代码时,程序“考试”的运行时可能是7或6,可能是由Copy-on-write引起的(我对此不太确定)
PS:
这样使用execlp
是一个好习惯:
if (pid == 0)
execlp("exam","exam",NULL);
或
if (pid != 0)
execlp("exam","exam",NULL);