这是问题
int main() {
int pid = fork();
if (!pid) {
// condition 1
} else {
// condition 2
}
return 0;
}
做什么(!pid)
?
这是问题
int main() {
int pid = fork();
if (!pid) {
// condition 1
} else {
// condition 2
}
return 0;
}
做什么(!pid)
?
它相当于:
if (!pid != 0) /* ... */
接着:
if (pid == 0) /* ... */
C11 (n1570), § 6.5.3.3 一元算术运算符
如果其操作数的值比较不等于 0,则逻辑否定运算符的结果
!
为 0,如果其操作数的值比较等于 0,则为 1。结果类型为int
。表达式!E
等价于(0==E)
。
! 运算符否定逻辑条件。
在 C 中,数值 0 被认为是逻辑假,任何其他数值都是逻辑真。! 运算符否定逻辑条件,因此当 pid 为 0 时为真,当 pid 不为 0 时为假。
您可以将其理解为“当没有 pid 时”。
是否定的意思。在您的情况下condition 1
,将在父进程中执行,condition 2
在子进程中。
if(!pid)
正如你所写:
if(pid == 0) {
/* do something */
}
接着:
if(pid)
是
if(pid != 0)
!pid
pid
如果等于零,表达式将为真。
基本上,它与以下内容相同:
if (pid == 0) {
}
在普通的旧 C 中,没有布尔数据类型,但有布尔逻辑。
true
除 0 外,所有数值都计算为false
。
这样做的结果是,如果你想测试一个条件是否为真,你实际上是在将它与 0 进行比较。
C 中的比较运算符产生 atrue
或false
结果,这意味着它们返回数字 1 或 0。
否定运算符反转true
为false
.
错误的事物:false、0、null 正确的事物:其他一切。
如果 !pid 为 true,pid 需要为 0、false 或 null
我想所有发布的答案都是正确的。在一行中,(!pid) 将等同于 (pid==0)。
然而,我借此机会解释如何/为什么在这里使用它。
fork()
函数将创建一个子进程 AKA 子进程。因此,当函数返回时,在该实例中将有 2 个进程,它们在同一位置执行代码。因此,它将返回进程的两个副本——我们称它们为父子节点。
的返回值fork()
是子进程的PID,当它在父进程中返回时。& 在子进程中为 = 0。在您的代码中,pid = fork();
将捕获此返回值。
如果 (pid==0) 那么你在子进程中。如果 (pid != 0) 你在父进程中。根据您是父母还是孩子,您可以更改代码的行为。(例如,您可以在孩子中调用 exec 并在父母中等待。)
有关 fork 功能的更多详细信息,请 google for fork()
。
(!pid)
相当于 (pid == 0)
实际上,问题中的代码是错误的。fork()
可以返回以下三件事之一:
>0
子进程的进程ID。这将返回给父级。
0
这将返回给孩子。
<0
失败。这将返回给父级。
检查本教程以正确使用fork
.