18

私はいくつかのCを学び始めており、フォークを勉強している間、予期しない出力が得られた関数を待ちます。少なくとも私にとっては。

親から2つの子プロセスのみを作成する方法はありますか?

ここに私のコード:

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

int main ()
{
    /* Create the pipe */
    int fd [2];
    pipe(fd);

    pid_t pid;
    pid_t pidb;


    pid = fork ();
    pidb = fork ();

    if (pid < 0)
    {
        printf ("Fork Failed\n");
        return -1;
    }
    else if (pid == 0)
    {
        //printf("I'm the child\n");
    }
    else 
    {
        //printf("I'm the parent\n");
    }

    printf("I'm pid %d\n",getpid());

    return 0;
}

そして、これが私の出力です:

I'm pid 6763
I'm pid 6765
I'm pid 6764
I'm pid 6766

パイプの部分は無視してください。まだそこまで到達していません。子プロセスを2つだけ作成しようとしているので、3つの「I'mpid ...」は、待機する親に対して1つだけを出力し、パイプを介して通信する2つの子プロセスを出力することを期待しています。

私のエラーがどこにあるかわかりたら教えてください。

4

5 に答える 5

32
pid = fork (); #1
pidb = fork (); #2

親プロセス ID が 100 であると仮定すると、最初の fork が別のプロセス 101 を作成します。100 と 101 の両方が #1 の後に実行を継続するため、2 番目の fork を実行します。pid 100 は #2 に到達し、別のプロセス 102 を作成します。pid 101 は #2 に到達し、別のプロセス 103 を作成します。したがって、4 つのプロセスになります。

あなたがすべきことは、このようなものです。

if(fork()) # parent
    if(fork()) #parent
    else # child2
else #child1
于 2012-06-06T06:21:26.283 に答える
13

process を作成したら、戻り値を確認する必要があります。そうしないと、 2番目fork()は親プロセスと子プロセスの両方で実行されるため、4つのプロセスがあります。

2 つの子プロセスを作成する場合は、次のようにします。

if (pid = fork()) {
    if (pid = fork()) {
        ;
    } 
} 

次のように n 個の子プロセスを作成できます。

for (i = 0; i < n; ++i) {
    pid = fork();
    if (pid > 0) {   /* I am the parent, create more children */
        continue;
    } else if (pid == 0) { /* I am a child, get to work */
        break;
    } else {
        printf("fork error\n");
        exit(1);
    }
}
于 2012-06-06T09:42:00.103 に答える
3

親によってforkステートメントが実行されると、期待どおりに子プロセスが作成されます。子プロセスもforkステートメントを実行しますが、0を返しますが、親はpidを返します。forkステートメントの後のすべてのコードは、親子の両方によって実行されます。

あなたの場合、起こっていたのは、最初のforkステートメントが子プロセスを作成したことでした。したがって、現在、1つの親P1と1つの子C1があります。

これで、P1とC1の両方が2番目のforkステートメントに遭遇します。親は期待どおりに別の子(c2)を作成しますが、子でさえ、c1は子プロセス(c3)を作成します。つまり、実際にはP1、C1、C2、およびC3があります。これが、4つのprintステートメント出力を取得した理由です。

これについて考える良い方法は、各ノードがプロセスを表し、ルートノードが最上位の親であるツリーを使用することです。

于 2012-06-06T06:32:55.523 に答える
0

( pid < 0 ) プロセスの作成が失敗したかのように値を確認できます。これは、子プロセスの作成が失敗したかどうかを示します.親プロセスから getpid() が使用されている場合、fork は子プロセスのプロセス ID を返します..

于 2015-02-24T19:36:47.313 に答える
0

子プロセス内に子プロセスを作成できます。このようにして、元の親プロセスのコピーを 2 つ持つことができます。

int main (void) {
    pid_t pid, pid2;
    int status;

    pid = fork();

    if (pid == 0) { //child process
        pid2 = fork();
        int status2;

        if (pid2 == 0) { //child of child process
            printf("friends!\n");
        }
        else {
            printf("my ");
            fflush(stdout);
            wait(&status2);
        }
    }
    else { //parent process
        printf("Hello ");
        fflush(stdout);
        wait(&status);
    }

    return 0;
}

これにより、次のように出力されます。

Hello my friends!
于 2015-06-13T17:25:50.643 に答える