Существует ли системный вызов или какой-либо способ узнать тип дескриптора файла в Linux (например, обычный файл fd, сокет fd, сигнал fd, таймер fd)? - PullRequest
2 голосов
/ 25 февраля 2020

Как я продолжаю обнаруживать, существует множество файловых дескрипторов - почти каждая вещь абстрагируется от файлового дескриптора: обычные файлы, сокеты, сигналы и таймеры (например). Все файловые дескрипторы являются просто целыми числами.

Учитывая файловый дескриптор, возможно ли узнать, что это за тип? Например, было бы хорошо иметь системный вызов, такой как getFdType (fd).

Если epoll_wait пробуждается из-за подготовки нескольких файловых дескрипторов, обработка каждого файлового дескриптора будет основываться на его типе. Вот почему мне нужен тип.

Конечно, я могу хранить эту информацию отдельно, но было бы удобнее, чтобы система поддерживала ее.

Кроме того, все дескрипторы файлов независимо от типа, последовательный. Я имею в виду, если вы откроете обычный файл данных, затем создадите дескриптор файла таймера, затем дескриптор файла сигнала, гарантированно ли они будут последовательно пронумерованы?

1 Ответ

2 голосов
/ 26 февраля 2020

Как упомянул "тот другой парень", самый очевидный такой вызов - 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 в первую очередь.

...