2011-07-20 36 views
2

私は、子プロセスが2つの長い値をパイプに書き込む必要があり、親プロセスがそれらを読み込む必要がある、linuxでC++でプログラムを書いています。今までは、このために2つの(名前付きの)パイプを設定し、それぞれをwrite(fd1、& value1、sizeof(long))で書き込み、read(fd1、& value1、sizeof(long))で読み取りました。 どちらのパイプもちょうどいいですが、これを行う方法を理解できませんでした。 パイプにさらに値を書き込んで読み込むにはどうすればいいですか?

は、私が試した:

write(fd1,&value1,sizeof(long)); 

write(fd1,&value2,sizeof(long)); 

と2は同様に読み取りますが、これは、ブロッキングとお互いを待っているプロセスにつながるようです。

誰かが私にヒントを与えることができれば、これを実現する方法は非常にうれしいです。

可能な解決策:私はいくつかの値を知っていたので、配列内のすべての値を書きました。

+0

パイプをフラッシュすることができますか? –

答えて

1

あなたのread()の戻り値をチェックすると、2つのlongは最終的に(おそらく)受信プロセスに一緒に送信されます。この場合、受信したバッファを2つのlongに分割する必要があります。

+0

'sizeof(long)'チャンクを読み込んでください。 – bdonlan

3

正常に動作するはずです。ここには非常に簡単な例があります。これは主にコードfrom the example in the man pageのコピーです。

int main(int argc, char *argv[]) 
{ 
    int fd[2]; 
    pid_t cpid; 
    int ret; 
    int val = 0; 
    if (pipe(fd) == -1) 
     { 
     perror("pipe"); exit(EXIT_FAILURE); 
     } 
    cpid = fork(); 
    if (cpid == -1) 
     { 
     perror("fork"); exit(EXIT_FAILURE); 
     } 
    if (cpid == 0) { 
     // close write end of pipe in child 
     close(fd[1]); 
     ret = read(fd[0], &val, sizeof(val)); 
     printf("1: result = %d, value = %d\n", ret, val); 
     ret = read(fd[0], &val, sizeof(val)); 
     printf("2: result = %d, value = %d\n", ret, val); 
     close(fd[0]); 
     _exit(EXIT_SUCCESS); 
     } 
    else { 
     // close read end of pipe in parent 
     close(fd[0]); 
     val = 42; 
     if (write(fd[1], &val, sizeof(val)) < 0) 
     perror("write"); 
     val++; 
     if (write(fd[1], &val, sizeof(val)) < 0) 
     perror("write"); 
     close(fd[1]); 
     wait(NULL); 
     exit(EXIT_SUCCESS); 
     } 
} 
関連する問題