質問
通常、C でフォークする必要がある場合は、次のようなことを行います。
pid_t p = fork();
if(p == 0) { /* do child stuff */ }
else { /* do parent stuff and pray there wasn't an error */ }
余分な変数を捨てて、以下を使用できることを思いつきました。
if(fork() == 0) { /* child */ }
else { /* parent/pray */ }
不適切なエラー処理はさておき、(なぜ) これが機能するのか、機能しないのか?
解決
あなたが提案していることは確かにうまくいきます。ただし、正常に動作するアプリケーションでは、エラー処理はオプションではありません。次の実装パターンも同様に簡潔で、エラーも処理します。さらに、後で親で使用して、たとえば子を待機する場合に備えて、fork() の戻り値を pid 変数に保存します。
switch (pid = fork()) {
case -1: /* Failure */
/* ... */
case 0: /* Child */
/* ... */
default: /* Parent */
/* ... */
}
他のヒント
親内の子プロセス ID が失われ、それが親に返されます。その情報は復元できると思いますが、おそらく一意には復元できません (つまり、すべての子の PID は取得できると思いますが、フォークしたばかりの子の PID は必ずしも取得できるとは限りません)。子の PID を知る必要がない場合は、2 番目の方法で問題ないと思います。
また、フォーク時にエラーがあった場合には -1 が返されますが、どちらの場合もテストしていないため、通常は間違いです。
代わりにこれを行うべきです。それが機能しないことを私は一度も知りませんでした。スティーブンスの本ではそのように書かれています。
int p;
if((p = fork()) == 0) { /* child */ }
else { /* parent/pray */ }
C ではこれを自由に行うことができ、親と子はフォークから異なる戻り値を受け取り、それが最初に評価されるため、機能します。唯一の問題は、あなたが述べたようにエラー処理です。また、子 PID を操作したい場合に、waitpid などを使用して子 PID を回復する他の方法はありません。
所属していません StackOverflow