这是问题
int main() {
int pid = fork();
if (!pid) {
// condition 1
} else {
// condition 2
}
return 0;
}
(!pid)
做什么?
答案 0 :(得分:10)
相当于:
if (!pid != 0) /* ... */
然后:
if (pid == 0) /* ... */
C11(n1570),§6.5.3.3一元算术运算符
如果操作数的值比较,则逻辑否定运算符
!
的结果为0 如果其操作数的值等于0,则不等于0,1,结果的类型为int
。 表达式!E
相当于(0==E)
。
答案 1 :(得分:3)
这意味着否定。在您的情况下,condition 1
将在子进程中的父进程condition 2
中执行。
答案 2 :(得分:2)
!pid
等于零, pid
表达式将为真。
基本上,它与:
相同if (pid == 0) {
}
答案 3 :(得分:2)
在普通的旧C中,没有布尔数据类型,但有布尔逻辑。
数值全部评估为true
,除了0,其值为false
。
这样做的结果是,如果你想测试条件是否为真,你实际上是将它与0进行比较。
C中的比较运算符产生true
或false
结果意味着它们返回数字1或0。
否定运算符将true
反转为false
。
答案 4 :(得分:0)
虚假的事情: false,0,null 事情是真的: 其他一切。
如果if!pid为true,则pid必须为0,false或null
答案 5 :(得分:0)
(!pid)
相当于(pid == 0)
实际上,问题中的代码是错误的。 fork()
可以返回以下三种内容之一:
>0
子进程的进程ID。这将返回给父母。
0
这将返回给孩子。
<0
失败。这将返回给父母。
检查this tutorial是否正确使用fork
的返回值。
答案 6 :(得分:0)
我猜所有发布的答案都是正确的。在一行中,(!pid)等同于(pid == 0) 然而,我借此机会解释如何/为何在这里使用它。
fork()
函数将创建一个子进程A.K.A.儿童过程。因此,当函数返回时,在该实例中将有2个进程,这些进程在代码相同的位置执行。因此,它将返回两个过程副本 - 我们称之为父母和子。
当父进程返回时,fork()
的返回值是子进程的PID。 &安培;在子进程中它是= 0。在您的代码中,pid = fork();
将捕获此返回值。
如果(pid == 0)那么您正处于子进程中。如果(pid!= 0)您处于父进程中。根据您是父母还是孩子,您可以更改代码的行为。 (例如,您可以在儿童中使用exec,在父母中等待。)
有关fork功能的更多详细信息,请访问fork()
。