2

私は Linux でのプロセス管理を学んでおり、次の C プログラムを実装してみました。その出力には 15 個の PID (4 個の一意の PID) が出力されました。プロセス ファミリー ツリーを理解しようとしましたが、PID が何度も印刷された理由を理解するのに本当に役立ちませんでした。http://u.cs.biu.ac.il/~linraz/os/OS2.pdfhttp://www.ibm.com/developerworks/aix/library/au-unixprocess.htmlを含むいくつかのリンクをたどりました、fork() の後、最初に実行するのは親か子か? . しかし、私は解決策を見つけることができませんでした。誰かがこの問題を理解するのを手伝ってくれたら、とても助かります。

    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>

    int main()
    {
           printf ( "Parent:%d Child: %d\n",getppid(),getpid()); // To print the PIDs of the parent process and the child process
           fork();               //System call to spawn a child process
           printf ( "Parent:%d Child: %d\n",getppid(),getpid()); 
           fork();
           printf ( "Parent:%d Child: %d\n",getppid(),getpid());
           fork();
           printf ( "Parent:%d Child: %d\n",getppid(),getpid());
           return 0;
    }
4

4 に答える 4

2

fork() 呼び出しプロセスを複製して新しいプロセスを作成します。子と呼ばれる新しいプロセスは、親と呼ばれる呼び出しプロセスの正確な複製です。

A fork() 
|----------------B
|                |   
|fork()          |
|----C           |
|    |           |

fork() を呼び出した場合、次の命令は子プロセスと親親プロセスによって実行されます

あなたのプログラムは次のようになります

       printf ("Hi"); //prints only one time   
       fork();
       printf ("Hi"); //prints two times
       fork();
       printf ("Hi"); //prints four times 

作成されたすべてのfork()子プロセスが正常に処理されたと見なします。

       printf ("Hi"); 
       fork();------------------------------------------------|
          |                                                   | 
       printf ("Hi");                                       printf ("Hi"); 
       fork();----------------|                             fork();---------------|
       printf ("Hi");      printf ("Hi");                   printf ("Hi");        printf ("Hi"); 
于 2013-10-11T17:35:00.667 に答える
1

プログラムが起動されると、カーネルはプログラムに PID を割り当てます。PPID は、プログラム (通常はシェル) を起動したプロセスの PID です。この回答の目的のために、シェルに の PID を割り当て、123プログラムには開始時に の pid が割り当てられ130ます。

出力の最初の行には、PPID と PID が表示されます。

Parent:123 Child: 130

プログラムが次に行うことは、それ自体を 2 つに分割することです。元のプログラムの PID と PPID は変更されず、子の PPID は元のプログラムの PID であり、子には新しい PID が割り当てられます。両方のプログラムが同じ出力チャネルに関連付けられているため、どちらかの出力が最初に表示される可能性があります。簡単にするために、出力が順序付けられていると仮定します。

Parent:123 Child: 130
Parent:130 Child: 131

今、あなたは二度目のフォークをしています...両方のプロセスが自分自身を複製しています。これで、出力を同じチャネルに出力したい 4 つのプロセスができました。

Parent:123 Child: 130
Parent:130 Child: 131
Parent:130 Child: 132
Parent:131 Child: 133

3 つ目のフォークでは、これら 4 つのプロセスすべてが再び複製されます。

Parent:123 Child: 130
Parent:130 Child: 131
Parent:130 Child: 132
Parent:131 Child: 133
Parent:130 Child: 134
Parent:131 Child: 135
Parent:132 Child: 136
Parent:133 Child: 137

質問は?

于 2013-10-11T17:16:54.607 に答える
0

するとfork、新しいプロセスが作成されますが、親もその実行を継続します。したがって、main4 つのプリントすべてを実行すると、最初のフォークで後続の 3 つのプリントが実行されます。各子と親が実行するコードを制御するには、forkフォークだけでなく、戻り値を使用する必要があります。

于 2013-10-11T17:12:18.723 に答える