我一直在使用进程间通信在Linux上为C++编写一个小程序。当尝试以一种非阻塞的方式读取一个进程并使用另一个进程写入(阻塞)时,我遇到了问题。问题看起来像这样,当父母试图用O_NONBLOCK
(或O_NDELAY
)读取管道时,它从不读取单个字节,并且当孩子试图在管道上写入时,管道将失败并发送破损的管道信号。下面是代码示例:Linux fifo(命名管道)O_NONBLOCK中断管道
// 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后,我找不到任何(简单)解释为什么如果我想读取非阻塞和写入阻塞,我应该重置文件描述符的标志。
任何人有解释或我做错了吗?
你确定管道的两端都打开(读写)吗? – Erwald 2013-02-17 17:46:02