何が起こっているかを追跡するこの代替コードを考えてみてください。
#include <stdio.h>
#include <unistd.h>
int main(void)
{
int ret1 = fork();
int ret2 = fork();
int ret3 = fork();
int ret4 = fork();
if (ret4 == 0)
printf("one: (%d: %d, %d, %d, %d)\n", (int)getpid(), ret1, ret2, ret3, ret4);
else
printf("two: (%d: %d, %d, %d, %d)\n", (int)getpid(), ret1, ret2, ret3, ret4);
return 0;
}
このバリエーションの出力を見せてください。何がうまくいき、何が失敗したかがわかります。
代替出力を見た後、Mac でこれを取得しました (Isis JL:
は私のプロンプトでrmk
あり、 の代替実装ですmake
)。
Isis JL: rmk fb && ./fb
/usr/bin/gcc -O3 -g -std=c99 -Wall -Wextra fb.c -o fb
two: (38068: 38069, 38070, 38071, 38072)
one: (38072: 38069, 38070, 38071, 0)
two: (38071: 38069, 38070, 0, 38075)
two: (38070: 38069, 0, 38074, 38077)
two: (38073: 0, 0, 38078, 38079)
two: (38069: 0, 38073, 38076, 38080)
one: (38075: 38069, 38070, 0, 0)
one: (38077: 38069, 0, 38074, 0)
Isis JL: two: (38074: 38069, 0, 0, 38081)
two: (38078: 0, 0, 0, 38082)
one: (38079: 0, 0, 38078, 0)
one: (38081: 38069, 0, 0, 0)
two: (38076: 0, 38073, 0, 38083)
one: (38080: 0, 38073, 38076, 0)
one: (38083: 0, 38073, 0, 0)
one: (38082: 0, 0, 0, 0)
Isis JL:
インターリーブされたプロンプトに注意してください。最後の空白行は、出力が完了した後にリターンを押した場所です。
仮説:
初期プロセスが停止した後、ideone の出力はキャプチャされません。
終了する前に子供が死ぬのを待つこの代替手段を試してください:
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main(void)
{
int ret1 = fork();
int ret2 = fork();
int ret3 = fork();
int ret4 = fork();
if (ret4 == 0)
printf("one: (%d: %d, %d, %d, %d)\n", (int)getpid(), ret1, ret2, ret3, ret4);
else
printf("two: (%d: %d, %d, %d, %d)\n", (int)getpid(), ret1, ret2, ret3, ret4);
while (wait(0) > 0)
;
return 0;
}
もう一度、Mac で出力します。
Isis JL: rmk fb && ./fb
/usr/bin/gcc -O3 -g -std=c99 -Wall -Wextra fb.c -o fb
two: (38111: 38112, 38113, 38114, 38115)
one: (38115: 38112, 38113, 38114, 0)
two: (38114: 38112, 38113, 0, 38119)
two: (38113: 38112, 0, 38117, 38121)
two: (38117: 38112, 0, 0, 38123)
one: (38119: 38112, 38113, 0, 0)
two: (38118: 0, 38116, 0, 38124)
one: (38121: 38112, 0, 38117, 0)
one: (38125: 0, 0, 38122, 0)
two: (38116: 0, 0, 38122, 38125)
two: (38122: 0, 0, 0, 38126)
two: (38112: 0, 38116, 38118, 38120)
one: (38120: 0, 38116, 38118, 0)
one: (38123: 38112, 0, 0, 0)
one: (38124: 0, 38116, 0, 0)
one: (38126: 0, 0, 0, 0)
Isis JL:
証明された仮説
何でも証明できる範囲で... http://ideone.com/zFoLn ...
これは、出力の 16 行すべてを示しています。問題は「早期終了」だったに違いありません。