什么叫if(!fork())?我有点困惑,我不知道什么时候我处于亲子过程中:
if(!fork())
if(!fork()) { // is it child or parent process? }else{ // is it child or parent process? }
xhv8bpkk1#
从fork(2) manpage:返回值
fork(2)
如果成功,则在父进程中返回子进程的ID,在子进程中返回0。失败时,在父进程中返回-1,不创建子进程,并适当设置errno。
0
-1
errno
由于fork()将0返回给子对象,因此if子句测试它是否是子对象:
fork()
if
if (!fork()) // same as: if (fork() == 0) { // child }else{ // parent }
9rygscc12#
对fork的调用在子级中返回0(当然,如果它可以工作的话),因此if语句的真(第一个)部分在那里运行(因为!0为真)。
fork
!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; } }
有了这种设置,你就可以“确切地”知道发生了什么,而不会丢失任何信息。
o8x7eapl3#
由于0可以在条件中使用,就像它是布尔值一样,所以这与询问相同:
if(fork() == 0) {
文件中写道:
如果成功,则在父进程中返回子进程的ID,在子进程中返回0。如果失败,则在父进程中返回-1,不创建子进程,并适当设置errno。
当编码者只关心“不是0”或0(“真”或“假”)时,直接在条件中使用整数值是一种常见的习惯用法。
o4tp2gmn4#
该代码不检查fork中的错误!当已经有太多的进程在运行,或者没有足够的内存时,fork将失败,并且您的软件将以一种可能非常奇怪的方式运行。
vs3odd8k5#
fork()的值可以是:
0父级,表示它是父级
由于if (!fork())只是写入if (fork() == 0)的一种快捷方式,因此它意味着:
if (!fork())
if (fork() == 0)
if(!fork()) { // it is a child process } else { // it is a parent process }
scyqe7ek6#
做man fork,你会知道得更多。它实际上返回pid_t,实际上是int
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())中的语句
child process
!0 == 1
6条答案
按热度按时间xhv8bpkk1#
从
fork(2)
manpage:返回值
如果成功,则在父进程中返回子进程的ID,在子进程中返回
0
。失败时,在父进程中返回-1
,不创建子进程,并适当设置errno
。由于
fork()
将0返回给子对象,因此if
子句测试它是否是子对象:9rygscc12#
对
fork
的调用在子级中返回0(当然,如果它可以工作的话),因此if
语句的真(第一个)部分在那里运行(因为!0
为真)。无论
fork
成功(返回子对象的ID)还是失败(返回-1
),FALSE(第二个)部分在父级中执行。我不是这个特殊方法的狂热粉丝,因为它没有考虑到所有的边缘情况。我更喜欢这样的东西:
有了这种设置,你就可以“确切地”知道发生了什么,而不会丢失任何信息。
o8x7eapl3#
由于
0
可以在条件中使用,就像它是布尔值一样,所以这与询问相同:文件中写道:
如果成功,则在父进程中返回子进程的ID,在子进程中返回0。如果失败,则在父进程中返回-1,不创建子进程,并适当设置errno。
当编码者只关心“不是
0
”或0
(“真”或“假”)时,直接在条件中使用整数值是一种常见的习惯用法。o4tp2gmn4#
该代码不检查fork中的错误!当已经有太多的进程在运行,或者没有足够的内存时,fork将失败,并且您的软件将以一种可能非常奇怪的方式运行。
vs3odd8k5#
fork()
的值可以是:由于
if (!fork())
只是写入if (fork() == 0)
的一种快捷方式,因此它意味着:scyqe7ek6#
做
man fork
,你会知道得更多。它实际上返回pid_t
,实际上是int
成功返回时,它为子进程提供
0
,为父进程提供正值实际上是这样的:
因此,当您执行
if(!fork())
时,它肯定意味着child process
,因为!0 == 1
,即,如果条件为真,它将执行if(!fork())
中的语句