()の後のプロセス数を計算するには、次のことをfork() && fork() || fork()
覚えておいてください。
そして、演算子の優先順位を使用して、次のように記述します。
(fork() && fork()) || fork()
フォークはNONZEROを親に返し、ZEROを子に返すことも忘れないでください
説明を簡単にするために、名前を変更します。
fork() && fork()
操作A
そして最後のfork()操作Bなので、前の行は次と同等です。
(fork() && fork()) || fork()
=> A || B
最初の行(fork
):
---> 2プロセス(父と子1)
2行目:
最初のフォーク=>
父は子供を与える=>父(Child2のPID)とChild2(ZERO)
子供1は子供を与える=> Child1(Child3のPID)とChild3(ZERO)
4つのプロセスがあります:Father(Child2のPID)、Child2(ZERO)、Child1(Child3のPID)、Child3(ZERO)
( )は、 NONZERO =>父と子1&& fork()
を返す最後の操作に対してのみ実行されます。
父は子供を与える=>父(Child4のPID)とChild4(ZERO)
子供1は子供を与える=> Child1(Child5のPID)とChild5(ZERO)
要約しましょう:
6つのプロセスがあります:
父(Child4のPID)、Child4(ZERO)、Child1(Child5のPID)、Child5(ZERO)、Child2(ZERO)、Child3(ZERO)
ZEROを返す最後のコマンドに対してのみ実行されます=>操作からZEROを返すプロセス。関係するプロセスは次のとおりです。
Child4(ZERO)、Child5(ZERO)、Child2(ZERO)、Child3(ZERO)
この4つのプロセスをフォークすると、4つの新しいプロセスで終了します=>Total number of process after second line = 10
3行目:単純なフォークです
=>プロセスの総数は=20です
それを実証するには:これを使用します(fork_quiz.c
)
#include <unistd.h>
#include <stdio.h>
int main(int argc, char **argv)
{
fork();
fork() && fork() || fork();
fork();
sleep(10);
return 0;
}
そしてそれをコンパイルします:
gcc -Wall fork_quiz.c -o fork_quiz
そしてそれをそのように実行します:
toc@UnixServer:~$ ./fork_quiz & (sleep 1; ps -o "%P%p%c")
[1] 15455
PPID PID COMMAND
15046 15047 bash
15047 15455 fork_quiz
15047 15456 bash
15455 15457 fork_quiz
15455 15458 fork_quiz
15455 15459 fork_quiz
15455 15460 fork_quiz
15457 15462 fork_quiz
15457 15463 fork_quiz
15457 15464 fork_quiz
15458 15465 fork_quiz
15458 15466 fork_quiz
15459 15467 fork_quiz
15459 15468 fork_quiz
15465 15469 fork_quiz
15467 15470 fork_quiz
15463 15471 fork_quiz
15463 15472 fork_quiz
15462 15473 fork_quiz
15462 15474 fork_quiz
15473 15475 fork_quiz
15471 15476 fork_quiz
15456 15477 ps