为什么使用fork()的代码有效?

时间:2016-04-21 18:38:20

标签: c fork

我的代码执行一些代码,具体取决于活动进程是无限循环中的父进程还是子进程:

pid_t childPID;

childPID=fork();

while (1)
{
    if (childPID >=0)
    {
        if (childPID==0)
        {
            [do child process stuff]
        }   
        else
        {
            [do parent process stuff]
        }
    }
    else
    {
        printf("\n Fork failed, quitting!!!!!\n");
        return 1;   
    }
 }

代码很简单,但对我来说有一个非常重要的事情,我不明白它是如何发生的,尽管我有猜测:

如果没有考虑到我们正在创建2个进程,那么看起来像childPid一直被重新设置,我认为没有任何意义。

所以我的猜测是,fork为每个进程创建一个childPid,向父进程返回0,向子进程返回pid,即使这个语法让我认为它只应返回一个结果并将其分配给chilPid。

我的猜测是正确还是还涉及其他一些事情?

谢谢。

3 个答案:

答案 0 :(得分:2)

  

所以我的猜测是,fork为每个进程创建一个childPid,向父进程返回0,向子进程返回pid,即使这个语法让我认为它只应返回一个结果并将其分配给chilPid。

正是如此。从fork参考手册:

  
    

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

  

所以

  

我的猜测

为什么猜测这是否在POSIX规范中精确定义?

答案 1 :(得分:1)

来自fork(2) linux man page

  

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

所以childPID在子进程中为0,在父进程中是child的pid

答案 2 :(得分:1)

fork做的是创建实际进程的新副本作为子进程。

childPID=fork();在两个进程中都被评估,它返回一个且只返回一个值,诀窍是该值根据执行的进程而不同。在父进程上,它返回新进程(子进程)的PID,并且子进程返回0,如果fork没有成功返回子进程-1永远不会被创造