隐式执行C fork系统调用

时间:2013-09-10 19:02:58

标签: c fork conditional-statements

我对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无关,但是它有隐含的部分(条件),我不明白。

感谢。

2 个答案:

答案 0 :(得分:2)

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

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

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

请注意,您的fork()有效,因为wait(0)将等待与父级相同的进程组中的任何子进程。但是,变量pid并不真正包含进程标识符。它保持逻辑的结果 - 不应用于fork()调用的结果。

答案 1 :(得分:1)

没有"隐含"。如果使用括号调用函数,则调用该函数。 pid的返回值为forkfn的返回值为someFunction。在您的情况下,该条件适用于这些值。