【问题标题】:How many times are executed the programs invoked by execl?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;
}

【问题讨论】:

  • 为什么不添加一些printfs 并运行它?
  • 运行一下就知道了?乍看之下,至少 1 个进程将“失败”到“学生”
  • @JonathonReinhart 因为这需要工作——这是 OP 希望避免的。如果你能骗到其他傻瓜为你做,为什么还要为工作而烦恼?
  • @MartinJames 我只是想弄清楚我的推理是否正确,您不必自大,这样的cmets是不必要的
  • @SérgioGomes 你的推理在我看来是正确的。

标签: c process exec fork


【解决方案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 的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多