使用fork()vs exec()创建新进程

时间:2018-04-18 08:04:23

标签: c++ c multithreading

#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分支?

我试图了解创建了多少进程以及代码睡眠的原因和时长?

提前致谢。

2 个答案:

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