2014-01-30 1 views
4

У меня есть программа чтения из файла «Foo» с помощью C++ с помощью:Проверьте, если файл является именованным каналом (ФИФО) в C++

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

Я хочу, чтобы это прекратить выполнение остальной части функции, если file - это именованный канал. Есть ли способ проверить, является ли файл именованным каналом перед его открытием?

Я нашел тот же самый вопрос, используя python: Check if file is a named pipe (fifo) in python? Могу ли я сделать что-то подобное на C++?

ответ

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(). Это потому, что syscall open() блокируется, пока кто-то не откроет FIFO для записи. Вместо этого используйте stat() syscall (на Unix/Linux) до fopen(), чтобы узнать.

+2

Использование 'stat', то' fopen' может привести к уязвимости TOCTTOU. Лучшим решением, если это проблема безопасности, является 'open', не блокирующий, а затем' fstat' и 'fdopen'. – Brian

+0

Я думал, что неблокирующее 'open()' означает, что последующие вызовы 'read()' не блокируются. Но поиск страниц на страницах подтвердил, что сам 'open()' тоже не блокируется. – SzG

 Смежные вопросы

  • Нет связанных вопросов^_^