質問

通常、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 を回復する他の方法はありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top