如何查看open()的错误

时间:2014-11-16 16:49:35

标签: c debugging error-handling named-pipes errno

即使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以指示错误类型。

我该怎么做才能知道为什么它不会开放?

1 个答案:

答案 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)进行调试。

另请参阅intro(2)Advanced Linux Programming