我使用C ++从文件“foo”读取程序:
pFile = fopen ("foo" , "r");
如果文件是命名管道,我希望它停止执行函数的其余部分。有没有办法在打开之前检查文件是否是命名管道?
我使用python发现了完全相同的问题: Check if file is a named pipe (fifo) in python?我可以在C ++中做类似的事情吗?
答案 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上)来查找。