fork_rv返回什么?

时间:2018-02-28 04:59:48

标签: c++

我知道fork()创建了一个重复的进程(clone),这意味着创建了两个相同的地址空间副本 - 一个用于父级,一个用于子级。此过程成为调用者的子进程。但是,我对fork_rv中的内容感到困惑(请参阅下面的代码中的注释)

include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

main()
{
int fork_rv;
printf("Before: my pid is %d\n",getpid());
fork_rv=fork();
if (fork_rv == -1)
perror("fork");
else if (fork_rv == 0)
printf ("I am the child. my pid=%d\n",getpid());
else
printf ("I am the parent. my child is %d\n",fork_rv); /* What is inside fork_rv What gets printed exactly? The address of the child?) */
}

2 个答案:

答案 0 :(得分:2)

fork

的Linux手册页引用
  

成功时,子进程的PID将在父进程中返回,并且   孩子返回0。失败时,在父项中返回-1,不创建子进程,并正确设置errno。

答案 1 :(得分:0)

虽然@Brian的答案已经正确,但也许解释这些返回值背后的逻辑会让人更容易理解:

  • -1表示错误应该是明确的。
  • 0作为子进程的值是有意义的,因为子进程总是可以获得自己的pid(getpid())以及其父进程的pid(getppid())。
  • 所有值&gt; 0是创建的新子进程的pid,返回到父进程。
    由于进程可以有多个子进程,因此无法使用'get child pid'功能:应该是哪个子进程的pid返回?使用'get children pids'功能可返回所有子进程pids的列表,找到最新的子进程的pid将非常麻烦。