gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:22:59 24 4
gpt4 key购买 nike

你能帮我解决这个问题吗?execl 调用的程序“exam”和“students”执行了多少次?我认为正确的答案是程序“考试”有 8 个运行时间,“学生”有 0 个运行时间,因为在前两个 fork 中将创建 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 ...                                       
|
+---+---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 也是如此。

因此,程序“考试”的运行时间为 8 个,“学生”的运行时间为 0。

但是,当您运行此代码时,程序“exam”的运行时间可能是 7 或 6,这可能是由 Copy-on-write 引起的(我对此不太确定)

PS:像这样使用 execlp 是一个很好的做法:

if (pid == 0)           
execlp("exam","exam",NULL);

if (pid != 0)           
execlp("exam","exam",NULL);

关于c - execl 调用的程序执行了多少次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28953597/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com