检查文件是否是C ++中的命名管道(fifo)

时间:2014-01-30 22:32:56

标签: c++ fifo

我使用C ++从文件“foo”读取程序:

pFile = fopen ("foo" , "r");

如果文件是命名管道,我希望它停止执行函数的其余部分。有没有办法在打开之前检查文件是否是命名管道?

我使用python发现了完全相同的问题: Check if file is a named pipe (fifo) in python?我可以在C ++中做类似的事情吗?

2 个答案:

答案 0 :(得分:6)

来自man 2 stat

  

int fstat(int filedes, struct stat *buf);

     

...定义了以下POSIX宏以使用st_mode字段检查文件类型:

         S_ISFIFO(m) FIFO (named pipe)?

所以struct stat st; ... !fstat(fileno(pFile, &st) && S_ISFIFO(st.st_mode)应该有用。

编辑:另请参阅SzG的优秀answer以及Brian对此的评论。

答案 1 :(得分:1)

fopen()之后停止执行可能有点太晚了。这是因为open()系统调用将阻塞,直到有人打开FIFO进行写入。相反,在stat()之前使用fopen()系统调用(在Unix / Linux上)来查找。