3

这是什么意思if(!fork())?我对此有点困惑,我不知道我什么时候在父子进程中:

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

7 回答 7

12

fork(2)手册页

返回值

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

由于fork()返回 0 给孩子,if 子句测试它是否是孩子:

if (!fork()) // same as: if (fork() == 0)
{
  // child
}else{
  // parent
}
于 2012-11-21T14:51:07.233 回答
3

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

if(fork() == 0) {

文档说:

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

当编码器只关心“not 0”或0(“true”或“false”)时,直接在条件中使用整数值是一种常见的习惯用法。

于 2012-11-21T14:50:01.600 回答
3

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

错误(第二)部分在父进程中执行,无论是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;
    }
}

通过该设置,您可以确切地知道发生了什么,而不会丢失任何信息。

于 2012-11-21T14:50:54.500 回答
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 */
}

于 2012-11-21T14:53:42.953 回答
1

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

于 2012-11-21T15:58:36.680 回答
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())

于 2012-11-21T14:49:40.783 回答
0

的值fork()可以是:

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

  • < 0,这是一个错误

  • > 0 父母,这意味着它是父母

由于if (!fork())只是一种简短的写作方式if (fork() == 0),因此意味着:

if(!fork()) {
  // it is a child process
}
else {
  // it is a parent process
}
于 2012-11-21T14:52:28.140 回答