if(!fork) - 这是什么意思?

时间:2012-11-21 14:47:55

标签: c unix fork

if(!fork())是什么意思?我对它有点困惑,我不知道我什么时候在父母和孩子的过程中:

if(!fork())
{
  // is it child or parent process?
}else{
  // is it child or parent process?
}

7 个答案:

答案 0 :(得分:8)

来自fork(2) manpage

  

返回值

     

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

由于fork()向子节点返回0,所以if子句测试它是否是子节点:

if (!fork()) // same as: if (fork() == 0)
{
  // child
}else{
  // parent
}

答案 1 :(得分:2)

因为0可以在条件中使用,就像它是布尔值一样,这与询问相同:

if(fork() == 0) {

文档说:

  

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

当编码器只关心“不0”或0(“真”或“假”)时,直接在条件中使用整数值是一种常见的习语。

答案 2 :(得分:2)

fork的调用在子节点中返回0(当然,如果它有效),所以if语句的真(第一)部分在那里运行(因为!0为真)。

false(第二)部分在父项中执行,无论fork成功(返回子项的PID)还是失败(返回-1)。

我不是这个特定方法的忠实粉丝,因为它没有考虑到所有边缘情况。我更喜欢这样的东西:

pid_t pid = fork();
switch (pid) {
    case -1: {
        // I am the parent, there is no child, see errno for detail.
        break;
    }
    case 0: {
        // I am the child.
        break;
    }
    default: {
        // I am the parent, child PID is in pid, eg, for waitpid().
        break;
    }
}

通过该设置,您知道完全正在发生什么,没有信息丢失。

答案 3 :(得分:1)

if(!fork())
{
  /*  its child, as child would only be created on success and return 0 which would have been turned into true by ! operator */
}else{
  /* it is parent because either success or failed, fork would have returned nonzero value and ! would have made it false */
}

if(!fork()) { /* its child, as child would only be created on success and return 0 which would have been turned into true by ! operator */ }else{ /* it is parent because either success or failed, fork would have returned nonzero value and ! would have made it false */ }

答案 4 :(得分:1)

该代码不会检查fork的错误!当已经有太多进程在运行时,或者没有足够的内存时,fork将会失败,并且您的软件可能会以非常奇怪的方式运行。

答案 5 :(得分:0)

执行man fork,您将了解更多信息。 它实际上返回pid_t,实际上是int

成功返回后,它会为子进程提供0,为父进程提供正值

实际上是这样的:

pid_t pid;
pid=fork();

if(pid <0)
{
 printf("fork failed");
 return -1;
}
else if(pid == 0) 
{
  it  is child process
}
else
{
  It is parent process
}

所以当你执行if(!fork())时,它意味着child process,因为!0 == 1,即如果条件为真,它将执行if(!fork())

内的语句

答案 6 :(得分:0)

fork()的值可以是:

  • 0,这意味着它是一个孩子

  • &LT; 0,这是一个错误

  • &GT; 0父母,这意味着它是父母

由于if (!fork())只是撰写if (fork() == 0)的简短方法,因此意味着:

if(!fork()) {
  // it is a child process
}
else {
  // it is a parent process
}