这是什么意思if(!fork())
?我对此有点困惑,我不知道我什么时候在父子进程中:
if(!fork())
{
// is it child or parent process?
}else{
// is it child or parent process?
}
返回值
成功时,父进程返回子进程的PID,子进程返回0。失败时,在父进程中返回 -1,不创建子进程,并适当设置 errno。
由于fork()
返回 0 给孩子,if 子句测试它是否是孩子:
if (!fork()) // same as: if (fork() == 0)
{
// child
}else{
// parent
}
因为0
可以在条件中使用,就好像它是一个布尔值一样,这与询问相同:
if(fork() == 0) {
文档说:
成功时,父进程返回子进程的PID,子进程返回0。失败时,在父进程中返回 -1,不创建子进程,并适当设置 errno。
当编码器只关心“not 0
”或0
(“true”或“false”)时,直接在条件中使用整数值是一种常见的习惯用法。
调用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;
}
}
通过该设置,您可以确切地知道发生了什么,而不会丢失任何信息。
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 */
}
该代码不检查来自 fork 的错误!当已经有太多进程在运行,或者没有足够的内存时,fork 将失败,您的软件可能会以一种非常奇怪的方式运行。
做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())
的值fork()
可以是:
0,这意味着它是一个孩子
< 0,这是一个错误
> 0 父母,这意味着它是父母
由于if (!fork())
只是一种简短的写作方式if (fork() == 0)
,因此意味着:
if(!fork()) {
// it is a child process
}
else {
// it is a parent process
}