2014-01-30 47 views

回答

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)應該工作。

+1

還有['S_ISFIFO(st.st_mode)'](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_stat.h.html#tag_13_62),它是 測試管道的宏或FIFO專用文件。目前尚不清楚您是否可以將管道與FIFO區分開來。 –

+0

謝謝! S_ISFIFO(st.st_mode)是我正在尋找的.. – crypton480

0

停止執行後可能有點太晚了fopen()。這是因爲open()系統調用會阻塞,直到有人打開FIFO進行寫入。相反,在fopen()之前使用stat()系統調用(在Unix/Linux上)找出。

+2

使用'stat'然後'fopen'可能導致TOCTTOU漏洞。如果這是一個安全問題,最好的解決方案是「打開」非阻塞,然後是「fstat」和「fdopen」。 – Brian

+0

我認爲一個非阻塞的open()意味着後續的read()調用是非阻塞的。但是查看手冊頁確認open()本身也是非阻塞的。 – SzG

相關問題