5

这是问题

int main() {
    int pid = fork();
    if (!pid) {
        // condition 1
    } else {
        // condition 2
    }
    return 0;
}

做什么(!pid)

4

9 回答 9

10

它相当于:

if (!pid != 0) /* ... */

接着:

if (pid == 0) /* ... */

C11 (n1570), § 6.5.3.3 一元算术运算符

如果其操作数的值比较不等于 0,则逻辑否定运算符的结果!为 0,如果其操作数的值比较等于 0,则为 1。结果类型为int。表达式!E等价于(0==E)

于 2012-12-19T12:24:33.490 回答
3

! 运算符否定逻辑条件。

在 C 中,数值 0 被认为是逻辑假,任何其他数值都是逻辑真。! 运算符否定逻辑条件,因此当 pid 为 0 时为真,当 pid 不为 0 时为假。

您可以将其理解为“当没有 pid 时”。

于 2012-12-19T12:27:04.550 回答
3

是否定的意思。在您的情况下condition 1,将在父进程中执行,condition 2在子进程中。

于 2012-12-19T12:27:10.260 回答
3
if(!pid)

正如你所写:

if(pid == 0) {
  /* do something */
}

接着:

if(pid) 

if(pid != 0)
于 2012-12-19T12:28:06.783 回答
2

!pidpid如果等于零,表达式将为真。

基本上,它与以下内容相同:

if (pid == 0) {
}
于 2012-12-19T12:26:45.330 回答
2

在普通的旧 C 中,没有布尔数据类型,但有布尔逻辑。

true除 0 外,所有数值都计算为false

这样做的结果是,如果你想测试一个条件是否为真,你实际上是在将它与 0 进行比较。

C 中的比较运算符产生 atruefalse结果,这意味着它们返回数字 1 或 0。

否定运算符反转truefalse.

于 2012-12-19T12:28:04.543 回答
1

错误的事物:false、0、null 正确的事物:其他一切。

如果 !pid 为 true,pid 需要为 0、false 或 null

于 2012-12-19T12:26:38.370 回答
0

我想所有发布的答案都是正确的。在一行中,(!pid) 将等同于 (pid==0)。
然而,我借此机会解释如何/为什么在这里使用它。

fork()函数将创建一个子进程 AKA 子进程。因此,当函数返回时,在该实例中将有 2 个进程,它们在同一位置执行代码。因此,它将返回进程的两个副本——我们称它们为父子节点。

的返回值fork()是子进程的PID,当它在父进程中返回时。& 在子进程中为 = 0。在您的代码中,pid = fork();将捕获此返回值。

如果 (pid==0) 那么你在子进程中。如果 (pid != 0) 你在父进程中。根据您是父母还是孩子,您可以更改代码的行为。(例如,您可以在孩子中调用 exec 并在父母中等待。)

有关 fork 功能的更多详细信息,请 google for fork()

于 2012-12-19T13:37:55.623 回答
0

(!pid)相当于 (pid == 0)

实际上,问题中的代码是错误的。fork()可以返回以下三件事之一:

>0 子进程的进程ID。这将返回给父级。

0 这将返回给孩子。

<0 失败。这将返回给父级。

检查本教程以正确使用fork.

于 2012-12-19T13:08:28.180 回答