execl调用的程序执行了多少次?

时间:2015-03-09 23:27:47

标签: c process exec fork

你能帮我解决这个问题吗? 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;
}

1 个答案:

答案 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);