単一の親プロセスがwhileループで複数の子を作成するプログラムを作成しようとしています。テストのために、私は4つのプロセス(1つの親とその3つの子)のみを作成しようとし始めました。しかし、(私の知る限り)その行に戻るための再帰はありませんが、子供たちは作成された行より上でコードを実行しているようです。
これが私が今持っているものです:
int main() {
time_t start;
time_t end;
int i = 0;
pid_t pid;
start = time(NULL);
printf("Αρχική τιμή δευτερολέπτων %d\n", start);
pid = fork();
printf("%d ", pid);
while (i < 2) {
if (pid > 0) {
fork();
wait();
i++;
}
}
printf("check ");
printf("%d", pid);
if (pid > 0) {
end = time(NULL);
printf("%d\n", end - start);
}
return 0;
}
そのための私の出力は次のとおりです。
Αρχική τιμή δευτερολέπτων 1547394155
29338 check 29338 0
29338 check 29338 0
29338 check 29338 0
29338 check 29338 0
したがってprintf ("%d ", pid)
、一度に2つのプロセスしか実行されていないはずなのに、4回実行されているように見えます。
これは、「fork()を使用するプログラムが出力を複数回出力することがあるのはなぜですか?」の問題に似ています。
printf("%d ", pid)
文字列が改行で終了しておらず、を呼び出さないため、出力バッファをすぐにフラッシュすることはありませんfflush(stdout)
。これは、フラッシュされていないバッファが子プロセスに継承され、最後のprintf()
呼び出し(改行を出力する)またはプログラムの実行の最後にバッファが最終的にフラッシュされたときに、元の親のPIDが何度も出力されることを意味します。
fflush(stdout)
そのprintf()
呼び出しの直後に挿入すると(適切なヘッダーを含めてwait()
正しく呼び出すとともに)、次のようになります。
Αρχική τιμή δευτερολέπτων 1547400480
79301 0 check 793010
check 793010
check 793010
check 793010
また、while
ループ内で無期限にループしているプロセス(pid
値がゼロの最初の子プロセス)が取得されることにも注意してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加