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

5m1hhzi4  于 2022-09-21  发布在  Unix
关注(0)|答案(6)|浏览(300)

什么叫if(!fork())?我有点困惑,我不知道什么时候我处于亲子过程中:

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

xhv8bpkk1#

fork(2) manpage
返回值

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

由于fork()将0返回给子对象,因此if子句测试它是否是子对象:

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

9rygscc12#

fork的调用在子级中返回0(当然,如果它可以工作的话),因此if语句的真(第一个)部分在那里运行(因为!0为真)。

无论fork成功(返回子对象的ID)还是失败(返回-1),FALSE(第二个)部分在父级中执行。

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

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;
    }
}

有了这种设置,你就可以“确切地”知道发生了什么,而不会丢失任何信息。

o8x7eapl

o8x7eapl3#

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

if(fork() == 0) {

文件中写道:

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

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

o4tp2gmn

o4tp2gmn4#

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

vs3odd8k

vs3odd8k5#

fork()的值可以是:

  • 0,这意味着它是一个孩子
  • <0,错误
  • 0父级,表示它是父级

由于if (!fork())只是写入if (fork() == 0)的一种快捷方式,因此它意味着:

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

scyqe7ek6#

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())中的语句

相关问题