2012-03-30 24 views
0
//child process 
    char buf[20]; 
    read(fd[0][0], buf, 20); 
    printf("%s", buf);  

//parent process 
    write(fd[0][1], "12", 20); 
    write(fd[0][1], "14", 20); 
    write(fd[0][1], "15", 20); 

--output-- 
    12 
    //then the program just exit. It cannot print out 14 and 15. 

この問題を解決するにはどうすればよいでしょうか?子プロセスが実際にパイプからデータを読み取るまで待つことができますか?C:pipe同じパイプに複数回データを書き込む方法は?

私のプログラムを編集しました。また、すべてのデータを読み取ることができます。しかし、プログラムはただ停止します。処理を続行できません。私はそれが子プロセスで止まると思います。

//child process 
    buf[6]; 
    int i; 
    while ((i = read(fd[0][0], buf, 6)) > 0) { 
     printf("%s", buf);  
    } 

//parent process 
    write(fd[0][1], "12", 2); 
    write(fd[0][1], "14", 2); 
    write(fd[0][1], "15", 2); 
    printf("done!\n"); 

--output-- 
    121415done 
    //The program just stopped in child process. 
+0

あなたの親プロセスが書き込みされる20バイト3回:あなたが欲しいのバイト数を取得することを確認するには、ループ内でreadを使用する必要があるだろう2つの文字、ヌルバイト、および17ゴミバイト。子は最初の20バイトだけを読み込みます。 –

+0

なぜあなたはwrite(fd、 "12"、20)を呼び出すのでしょうか?3つの文字を送信しているので、write(fd、 "12"、3)そして、20バイトを送信すると、この20バイトを受け取って "12"を出力します。もう一度お読みになりますか?残りのメッセージを受け取るには? – rbelli

+0

いいえ、私は子プロセスで一度だけreadを呼び出しました。子供がすべてのメッセージを読むことができるようにするにはどうすればよいですか? –

答えて

1
static const int BUF_SIZE = 4; 
char buf[BUF_SIZE]; 

ssize_t read_bytes; 
int i; 

while ((read_bytes = read(fd[0][0], buf, BUF_SIZE)) > 0) { 
    printf("BUF: {\n'"); 

    for (i = 0; i < read_bytes; ++i) { 
     if (buf[i] != '\0') 
      putchar(buf[i]); 
    } 

    printf("'\n} : EOBUF[%d]\n", nbytes); 
} 

if (read_bytes < 0) { 
    perror("FAIL"); 
} 

編集:書き込みサイズ>は、書き込みデータカントーであれば、悪い作品。最後にゴミ。

0

パイプからデータを読み込んだ。あなたは "20バイトまで読んでください"と言っていました(17 ゴミ箱バイトもあり、あなたの親プロセスはそれらを送信しようとしている3バイトバッファの最後を読み取っていました)。それ以上のバイトを読み取る場合は、read()をもう一度呼び出します。

+0

実際、私は別のパイプで子供に書きます。たとえば、fd [0] [1]やfd [1] [0]などで書き込むことがあります。子供がすべてのメッセージを読むことができるようにするにはどうすればよいですか? –

0

readまで、指定したバイト数をを読み込みます。これはバッファリングに依存します。

//child process 
#define MAXLEN 20 
int total_read = 0, n; 
char buf[MAXLEN + 1]; 
buf[MAXLEN] = 0; 
p = buf; 
while (total_read < MAXLEN) { 
    n = read(fd[0][0], p, MAXLEN - total_read); 
    if (n < 0) 
     break; //error 
    if (n == 0) 
     break; //end of file 
    total_read += n; 
    p += n; 
} 
printf("%s", buf); 
関連する問題