4

通常、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 */ }

不適切なエラー処理はさておき、(なぜ)これは機能するか機能しないのですか?

4

4 に答える 4

20

あなたが提案していることは確かにうまくいくでしょう。ただし、行儀の良いアプリケーションでは、エラー処理はオプションではありません。次の実装パターンも同様に簡潔で、エラーも処理します。さらに、fork() の戻り値を pid 変数に保存します。これは、後で親でそれを使用して、たとえば子を待つ場合に備えています。

switch (pid = fork()) {
case -1:       /* Failure */
  /* ... */
case 0:        /* Child */
  /* ... */
default:       /* Parent */
  /* ... */
}
于 2008-09-25T17:02:46.110 に答える
4

親に返される子プロセス ID が親で失われます。その情報を復元できると思いますが、おそらく一意ではありません (つまり、すべての子の PID を取得できると思いますが、フォークしたばかりの子の PID を取得できるとは限りません)。子供の PID を知る必要がない場合は、2 番目の方法で問題ないと思います。

また、分岐にエラーがある場合は -1 が返されますが、どちらの場合もテストしていませんが、これは通常は間違いです。

于 2008-09-25T16:58:41.640 に答える
2

代わりにこれを行う必要があります。私はそれが機能しないことを知りませんでした。それは、スティーブンスの本で行われている方法です。

int p;
if((p = fork()) == 0) { /* child */ }
else { /* parent/pray */ }
于 2008-09-25T16:59:27.707 に答える
1

親と子はフォークから異なる戻り値を受け取り、最初に評価されるため、Cで自由に行うことができます。あなたが言及したように、唯一の問題はエラー処理です。また、waitpid などを使用して子 PID を操作したい場合に備えて、子 PID を回復する他の方法はありません。

于 2008-09-25T17:01:39.527 に答える