2
int main()
{
fork();
fork() && fork() || fork();
fork();

printf("forked\n");
return 0;
}

fork関数を呼び出すと、親はゼロ以外のpidを取得し、子は0を取得します。このロジックに基づいて、2番目のステートメントでは、短絡の原理(afaik)を適用する必要があります。 2つのプロセスがあると呼びます、

2行目以降、8つの処理が行われます。[親は(fork()&& fork())で2回フォークされ、2番目の子も " fork()|| fork() "のために2回フォークされます]

そして最後に16(私の推論によると)

これが正しいか、他のロジックが関係しているかどうかを教えてください

4

2 に答える 2

7

()の後のプロセス数を計算するには、次のことをfork() && fork() || fork()覚えておいてください。

  • &&)論理演算子の場合:左側がNONZEROの場合にのみ右側が評価されます

  • ||)論理演算子の場合:左側がゼロの場合にのみ右側が評価されます

そして、演算子の優先順位を使用して、次のように記述します。

(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)

  • B操作

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
于 2012-08-12T16:10:02.267 に答える
1

生成されたプロセスをカウントするために、プログラムを少し書き直してみましょう。

#include <stdio.h>

int my_fork(const char *c) {
    int r = fork();
    if (!r) {
        fprintf(stderr, "process spawned at %s\n", c);
    }
    return r;
}

int main()
{
my_fork("a");
my_fork("b") && my_fork("c") || my_fork("d");
my_fork("e");

return 0;
}

起動時に19行が表示されるため、呼び出しprocess spawnedの結果として19個のプロセスが生成されました。fork()

~$ ./test
process spawned at a
process spawned at c
process spawned at c
process spawned at e
process spawned at e
process spawned at b
process spawned at d
process spawned at d
process spawned at e
process spawned at e
process spawned at e
process spawned at d
process spawned at e
process spawned at e
process spawned at b
process spawned at e
process spawned at d
process spawned at e
process spawned at e

UPD:Cには短絡ブール評価があることを念頭に置いて、プロセス数を簡単に計算できます。

于 2012-08-12T14:32:42.503 に答える