我一直在使用进程间通信在 C++ 中为 linux 编写一个小程序。我在尝试以非阻塞方式读取一个进程并使用另一个进程写入(阻塞)时遇到问题。问题看起来像这样,当父级尝试使用O_NONBLOCK
(or O_NDELAY
) 读取管道时,它从不读取单个字节,而当子级尝试在管道上写入时,它会失败并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);
是在非阻塞开放调用之后立即使用。
阅读手册页后,我找不到任何(简单)解释,如果我想读取非阻塞和写入阻塞,我为什么要重置文件描述符的标志。
有人有解释还是我做错了?