プロセス間通信を使用して、Linux用のC ++で小さなプログラムを書いています。あるプロセスでブロックしない方法で読み取り、別のプロセスで書き込み (ブロック) しようとしたときに問題が発生しました。問題は次のようになります。親がO_NONBLOCK
(またはO_NDELAY
) を使用してパイプを読み取ろうとすると、1 バイトも読み取れず、子がパイプに書き込もうとすると失敗し、SIGPIPE
壊れたパイプ信号が送信されます。コードの例を次に示します。
// Parent process
mkfifo(PROC_COPROC, 0666);
int fd_co = open(PROC_COPROC, O_RDONLY | O_NDELAY);
char c;
int n;
fcntl(fd_co,F_SETFL,0); //fix it
while ((n = read(fd_co, &c, 1)) > 0)
{
printf("%c", c);
}
close(fd_co);
// Child process
int fd = open(PROC_COPROC, O_WRONLY | O_APPEND);
if ( fd != -1 )
{
write( fd , "message\n" , 8); //Fails here if flag not set
}
else
printf("Ne peut pas ecrire sur le fifo\n");
close(fd);
fcntl(fd_co,F_SETFL,0);
ノンブロッキングオープンコールの直後に使用することで、これを解決する方法を最終的に見つけました。
man pageを読んだ後、非ブロッキングを読み取り、ブロッキングを書き込みたい場合にファイル記述子のフラグをリセットする必要がある理由の (簡単な) 説明が見つかりませんでした。
誰にも説明がありますか、それとも間違っていますか?