1

子プロセスを開始しようとしていて、パイプを介してコマンドを送信しています。そして、私が知らない概念が恋しいと思います。

最初のコマンド送信は成功し、もう 1 つは失敗し、無限ループになりました。そして、私はその理由を理解していません。

親.c

int invoke_proc(int out_tube[2]) {

    pid_t pid; 
    int rv; 
    int tube[2];

    if(pipe (tube)) {
        fprintf(stderr, "pipe");
        exit(1);
    }

    pid = fork();
    if (pid == -1) {
        fprintf(stderr, "fork");
        exit(1);
    }

    // parent
    if(pid) {
        close(tube[0]);
        out_tube[1] = tube[1];
    }

    // child
    else {
        close(tube[1]);
        dup2(tube[0], 0);
        execl("child", "child", NULL);
    }

    return 0;
}

int main() {
    int tube[2];
    //for (int i = 0; i < 2; i++) {
        invoke_proc(tube);

        sleep(2);
        write(tube[1], "allo\n", 7);
        printf("!\n");

        sleep(5);
        write(tube[1], "bye bye\n", 10);
        printf("!\n");

        sleep(5);
        write(tube[1], "exit\n", 10);
        printf("!\n");

        close(tube[1]);

    //}
    return 0;
}

child.c

int main() {
    char string[100];

    printf("Child Process: [%d]\n", getpid()); 
    printf("-------------\n"); 

    do{ 
        printf("Enter Command: "); 

        fflush(stdout); 

        fgets(string, 100, stdin); 
        printf("[%s]\n",string);    

    } while(strcmp(string, "exit"));
    return 0;   
}

出力は次のとおりです。

-bash-4.1$ ./parent 子プロセス: [61983]


コマンドを入力してください: [allo

]

!

コマンドを入力してください: !

[]

コマンドを入力してください: ^C

-bash-4.1$

プロセスを終了しました。そうしないと、この後に無限ループが発生します。

同様の質問を読んでいますが、答えが見つかりません。できれば、できるだけ簡単に答えてください。

ありがとう。

追伸 はい、これは学校の課題です。私の目標は、同じコマンドを複数の子に送信することです。しかし、私は最初にこのステップから抜け出そうとしています。

4

1 に答える 1