#1 code
int child_pid;
for (int i = 0; i < 3; i++)
{
child_pid = fork();
if (child_pid == 0)
{ sleep(10); }
else
{ wait(&status); }
}
execlp("sleep","sleep","20",(char*)NULL);
#2 code
int child_pid;
for (int i = 0; i < 5; i++)
{
child_pid = fork();
if (child_pid == 0)
{ sleep(1); }
else
{ wait(&status);
execlp("sleep","sleep","20",(char*)NULL); }
}
有人可以向我解释这些代码中发生了什么吗? 我理解fork()向新创建的子进程返回零。这就是为什么我不明白为什么#2代码中的else分支也正在被执行? Execlp用新的过程映像替换调用过程映像,但这究竟意味着什么?
编辑: 答案是第一个代码将创建8个进程,但我无法理解如何?为什么第一个代码会完成230秒? exec如何影响这个?
第二个代码将创建5个进程,但它将在(5 * 2sec + 5 * 20sec)之后完成。在第二个代码中为什么要转到else分支?
我试图了解创建了多少进程以及代码睡眠的原因和时长?
提前致谢。
答案 0 :(得分:2)
fork将返回两次,一个在原始进程中,返回值为子进程的pid,另一个在子进程中,返回值为零
答案 1 :(得分:0)
说明
fork()通过复制调用进程来创建一个新进程。新流程称为子流程。调用过程称为父进程。
和
返回值
成功时,子进程的PID在父进程中返回,并在子进程中返回0。失败时,在父项中返回-1,不创建子进程,并正确设置errno。
所以,在fork()之后,你有了新创建的进程,所以你有 2进程,子进程(新进程)和父进程(初始进程)。
那么,当你的父母(pid&gt; 0)正在执行你的睡眠时,你的孩子(pid == 0)会进入睡眠状态。
在执行了exec *(execl,execlp,execv,execve等等)后,你的进程终止了(尝试放置printf或者你的execlp之后的任何东西,你会发现它永远不会打印出来(除非是这样)错误(execlp的返回值== -1))。
回答您的初步问题: 是的,你的程序在你的else中输入if AND (把printf看得更清楚),因为你实际上有2个进程,你甚至可以尝试在else语句之后放一个printf,at程序的最后,你会看到孩子通过(打印他的pid,它应该等于0)。