1

Cフォーク機能の1つの側面と混同しています。

私がこれを行う場合:

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 とは関係ありませんが、暗黙の部分 ( condition ) がわかりません。

ありがとう。

4

2 に答える 2

3

C では、代入の結果は、代入が完了した後に変数が保持する値と等しい値を持つ式になります。条件付きテストでは、ゼロ値はすべて「false」と見なされ、それ以外の場合、条件は「true」と評価されます。

どちらの例でも、割り当ての結果は条件ステートメントのテストとして使用されます。一部の C コンパイラは、この構文を検出すると警告を発行します。これは、(等価) が意図されている=ときに誤って (代入) を入力することがよくある間違いであるためです。==通常、この警告は、追加の括弧を使用して割り当てをテスト値として実際に使用するつもりであることをコンパイラーに伝えることによって抑制されます。

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

親と同じプロセスグループ内の子プロセスを待機するfork()ため、機能することに注意してください。wait(0)ただし、この変数pidは実際にはプロセス ID を保持していません。呼び出しの結果に論理否定を適用した結果を保持していfork()ます。

于 2013-09-10T19:07:50.610 に答える
1

「暗黙的」というものはありません。括弧で関数を呼び出すと、関数が呼び出されます。pidの戻り値がありforkfnの戻り値がありsomeFunctionます。あなたの場合、条件はこれらの値に適用されます。

于 2013-09-10T19:06:56.510 に答える