UNIX プロセス作成システム コール fork() を呼び出すたびに、2 回返されます。まず子のPIDを親(fork()を呼んだプロセス)に返します。次に、新しく作成された子に 0 に戻ります。
マニュアルページから:
戻り値
成功すると、子プロセスの PID が親に返され、0 が子に返されます。失敗すると、親に -1 が返され、子プロセスは作成されず、errno が適切に設定されます。
あなたの場合
if (fork() && !fork())
内のステートメントはif
、fork を 2 回呼び出します。したがって、何が起こるかは次のとおりです。
A
|----------------B
| |
|---C |
| | |
への最初の呼び出しfork()
は、A と B の両方で返されます。A では非ゼロになり、B ではゼロになります。
fork() の 2 回目の呼び出しは A からのみ呼び出されます。最初の fork が B に 0 を返したため、2 回目の呼び出しは行われませんfork()
。これは、最初のオペランドがゼロ以外の場合に評価を短絡するためです。&&
これを指摘してくれたダニエルに感謝します。
したがって、これから表を作成できます。
PID fork()1 fork()2
------------------------------
A >0 >0
B =0 >0
C >0 =0
したがって、チャートから、プロセス CはTRUEif
と評価されます。
fork()1
C に戻らなかったことを覚えておくことが重要です。親から既に評価された式のコピーを取得しました。
これがあなたの質問を説明することを願っています。