即使mkfifo()
成功,我正在使用管道和一个管道也不会打开。
我有这个:
/* create the FIFO (named pipe) */
int ret_mk = mkfifo(out_myfifo, 0666);
if(ret_mk < 0) {
perror(out_myfifo);
unlink(out_myfifo);
return -1;
}
printf("ret_mk = %d\n", ret_mk);
/* write to the FIFO */
out_fd = open(out_myfifo, O_WRONLY);
printf("out_fd = %d\n", out_fd);
但在open()
之后没有任何内容被打印出来,即使随机文字的印刷品也不会出现。
来自here我们有:
open()
函数返回一个整数值,用于引用该文件。如果不成功,则返回-1,并设置全局变量errno
以指示错误类型。
我该怎么做才能知道为什么它不会开放?
答案 0 :(得分:2)
阅读fifo(7)。对于FIFO,open
呼叫可能会阻止。要使open(2)无阻塞,请在flag参数中使用O_NONBLOCK
:
out_fd = open(out_myfifo, O_WRONLY|O_NONBLOCK);
if (out_fd<0) perror(out_myfifo);
printf("%d\n", out_fd);
但通常你想要一个阻塞open
来写入FIFO,因为其他一些进程应open
相同的 FIFO进行读取(并且你希望你的写作过程等待这种情况发生。)
请注意,poll(2)没有办法让其他人打开FIFO的另一端(因为poll
想要打开文件描述符)。另见inotify(7);您可能还想使用unix(7)套接字。
顺便说一句,您也可以使用strace(1)进行调试。