1

我对 C fork 函数的一个方面感到困惑。

如果我这样做:

int pid;

if ( pid = !fork()) {
    //some code
} else {
    printf("%d\n","Waiting for child");
    wait(&pid);
}
return 0;

Fork 将以某种方式隐式执行,但我无法理解。正如我所看到的,这样的事情是 C 中的常见习语:

int fn;

while ( fn = someFunction()) {
    //doSomething
}

最后一个示例与 fork 无关,但它具有我不理解的隐含部分(条件)。

谢谢。

4

2 回答 2

3

在 C 中,赋值的结果是一个表达式,其值等于赋值完成后变量所持有的值。在条件测试中,任何零值都将被视为“假”,否则条件将评估为“真”。

在您的两个示例中,分配的结果都用作条件语句的测试。一些 C 编译器在看到此构造时会发出警告,因为在预期 ( =equality) 时意外键入 (assginment)是一个常见错误==。通常通过告诉编译器您确实打算将赋值用作带有一组额外括号的测试值来抑制警告:

while ( (fn = someFunction()) ) {
    //doSomething
}

请注意,您的fork()工作因为wait(0)将等待与父进程相同的进程组中的任何子进程。但是,该变量pid实际上并不包含进程标识符。它持有的结果是逻辑未应用到fork()调用的结果。

于 2013-09-10T19:07:50.610 回答
1

没有“隐式”这样的东西。在您调用带括号的函数的地方,该函数被调用。pid将具有 的返回值fork,并且fn将具有 的返回值someFunction。在您的情况下,该条件适用于这些值。

于 2013-09-10T19:06:56.510 回答