В Linux ответ можно получить из каталога /proc/<PID>/fd
.Цитируя документацию /proc
( man 5 proc ):
Для файловых дескрипторов для каналов и сокетов записи будут символическими ссылками, содержимое которых является типом файла с индексом,Вызов readlink (2) для этого файла возвращает строку в формате:
type:[inode]
Например, сокет: [2248868] будет сокетом, а его индекс будет 2248868. Для сокетов этот индекс может бытьиспользуется для поиска дополнительной информации в одном из файлов в /proc/net/.
Давайте проверим, что:
$ bash -c 'true | ls -l /proc/self/fd/0'
lr-x------ 1 user user 64 Sep 13 03:58 /proc/self/fd/0 -> 'pipe:[54741]'
Так будет ли у труб и сокетов инод?Да !А как насчет FIFO?Мы можем догадаться, что, поскольку у них есть имя файла, у них есть inode (и я не думаю, что записи каталога без inode могут существовать).Но давайте проверим:
$ mkfifo foobar.fifo
$ ls -i foobar.fifo
1093642 foobar.fifo
Ответ "да, у FIFO тоже есть inode".
Однако возникает важный вопрос: inode - это свойства файловых систем, а inode не являются уникальными для файловых систем , так на какую файловую систему ссылаются, когда мы видим inode канала?Оказывается, существует pipefs
виртуальная файловая система , которая смонтирована в пространстве ядра, а не в пространстве пользователя.Он управляет как каналами, так и FIFO, поэтому номер инода, который вы видите, является примером /proc
и является свойством этих файловых систем, а не файловой системы, которую вы имеете на диске.И да, анонимные каналы и анонимные сокеты не будут иметь inode в файловой системе диска, потому что на диске нет имени файла и байтов (хотя может быть кеширование данных, а на самом деле старые Unixes кэшируют каналы на диск).FIFO и сокеты Unix-домена, однако, имеют имя файла в файловой системе, поэтому в примере foobar.fifo
этот inode принадлежит файловой системе диска.
См. Также: