Как упомянул "тот другой парень", самый очевидный такой вызов - fstat
. Элемент st_mode
содержит биты, различающие guish между обычными файлами, устройствами, сокетами, каналами и т. Д. c.
Но на практике вам почти наверняка придется отслеживать себя какой фд какой Знание, что это обычный файл, не слишком помогает, когда у вас открыто несколько разных обычных файлов. Так как вы все равно должны хранить эту информацию где-то в своем коде, то обращение к этой записи представляется наиболее надежным способом go.
(также будет намного быстрее проверить некоторые Переменные в вашей программе, чем сделать один или несколько дополнительных системных вызовов.)
Кроме того, все файловые дескрипторы, независимо от типа, являются последовательными. Я имею в виду, если вы откроете обычный файл данных, затем создадите дескриптор файла таймера, а затем дескриптор файла сигнала, гарантированно ли они будут пронумерованы последовательно?
Не совсем.
Насколько я знаю, вызовы, которые создают новый fd, всегда будут возвращать наименьший доступный fd. Есть старые программы, которые полагаются на это поведение; до того, как существовал dup2
, я считаю, что принятым способом перемещения стандартного ввода в новый файл был close(0); open("myfile", ...);
.
Однако сложно быть уверенным, какие fds доступны. Например, пользователь, возможно, запустил вашу программу как /usr/bin/prog 5>/some/file/somewhere
, и тогда окажется, что fd 5 пропущен, потому что /some/file/somewhere
уже открыт на fd 5. Таким образом, если вы откроете несколько файлов подряд, вы Я не могу быть уверен, что вы получите последовательные fds, если только вы сами не закрыли все эти fds и не уверены, что все fds с меньшим номером уже используются. И делать это, кажется, намного больше хлопот (и источник потенциальных проблем), чем просто отслеживать fds в первую очередь.