5

私はこのコードでいくつかの問題を実験しています:

#include <stdio.h>
#include <stdlib.h>

#define SIZE 30
#define Error_(x) { perror(x); exit(1); }
int main(int argc, char *argv[]) {

    char message[SIZE];
    int pid, status, ret, fd[2];

    ret = pipe(fd);
    if(ret == -1) Error_("Pipe creation");

    if((pid = fork()) == -1) Error_("Fork error");

    if(pid == 0){ //child process: reader (child wants to receive data from the parent)
        close(fd[1]); //reader closes unused ch.
        while( read(fd[0], message, SIZE) > 0 )
                printf("Message: %s", message);
        close(fd[0]);
    }
    else{//parent: writer (reads from STDIN, sends data to the child)
        close(fd[0]);
        puts("Tipe some text ('quit to exit')");
        do{
            fgets(message, SIZE, stdin);
            write(fd[1], message, SIZE);
        }while(strcmp(message, "quit\n") != 0);
        close(fd[1]);
        wait(&status);
    }
}

コードは正常に動作しますが、その理由を説明できません! 親プロセスと子プロセスの間に明示的な同期はありません。子プロセスが親の前に実行される場合、 read は 0 を返さなければならず、プロセスは終了しますが、何らかの理由で親の実行を待ちます。これをどう説明しますか?多分私は何かが足りない。

(編集済み)

4

1 に答える 1

5

O_NONBLOCKinを使用しなかったためpipe2readデフォルトでブロックされています。したがって、データがパイプに書き込まれるまで待機します。

于 2013-02-09T12:42:24.673 に答える