2

私は C/C++ で OS 開発を学んでおり、 fork() メソッドを使用してプロセスを実験しています。次のようなコードがあります。

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
    fork(); //create a child process, currently total is 1 parent, 1 child
    fork(); //create a child process,currently total is 2 parents, 2 child
    pid_t pid;
    if((pid=fork()) == 0) { //fork() and assign to pid, now has 4 parents, 4 childs
        printf("I am the child: %u\n", getpid());
    else {
        printf("I am the parent: %u and my child is: %u\n", getpid(), pid);
    }
}

コンパイルして実行すると、予想どおり 4 つの親と 4 つの子が表示されますが、出力が奇妙に見えます (user@slacker:~$ の後に出力を取得する下の太字の行に注意してください)。

user@slacker:~$ gcc forktest.c -o forktest

user@slacker:~$ ./forktest

私は親です: 1183 そして私の子供は: 1186

user@slacker:~$ 私は親です: 1184 そして私の子供は: 1188

私は親です: 1185 そして私の子供は: 1189

私は親です: 1187 そして私の子供は: 1190

私は子供です: 1186

私は子供です: 1189

私は子供です: 1190

私は子供です: 1191

3 fork() で試してみたところ、出力はさらに奇妙です。誰か説明してくれませんか?

4

1 に答える 1

5
         fork            fork            fork
  1183----+---------------+----------------+-------------------->
          |               |                |
          |               |           1186 +-------------------->
          |               |
          |         1185  +----------------+-------------------->
          |                                |
          |                           1189 +-------------------->
          |
  1184    +---------------+----------------+-------------------->
                          |                |
                          |           1188 +-------------------->
                          |
                  1187    +----------------+-------------------->
                                           |
                                      1190 +-------------------->

http://www.asciiflow.com/#Drawで作成

于 2013-10-30T02:54:35.853 に答える