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;

【问题讨论】:

为什么不添加一些printfs 并运行它? 运行一下就知道了?乍看之下,至少 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调用的程序执行了多少次?的主要内容,如果未能解决你的问题,请参考以下文章

在matlab里调用一个函数,怎么知道它计算过程中迭代了多少次呢

游标中定义的查询执行多少次?

cmd中控制某个命令执行多少次

Python 函数

7.4 分析文件内容,判断 fgets 共执行了多少次?

Golang之不可重入函数实现