Существует ли независимый от платформы неблокирующий способ определить, является ли дескриптор файла файлом на диске (обычный каталог / каталог) - PullRequest
5 голосов
/ 12 октября 2019

Я ищу тип файлового дескриптора без возможности блокировки в ядре. Я знаю, что могу использовать fstat(2), но fstat также даст мне все виды метаданных (время доступа и т. Д.), Которые могут блокироваться в течение произвольного промежутка времени (особенно в сетевых файловых системах).

РЕДАКТИРОВАТЬ: Я ищу syscall для этого, порождение отдельного процесса недопустимо, потому что порождение процесса и чтение его результатов, конечно, не мгновенно.

Единственное, что мне нужно знать, это действительнодескриптор файла - это «файл» на диске (S_IFREG, S_IFLNK, S_IFDIR) или нет. В качестве альтернативы, если бы я мог сказать, будет ли это сокет (S_IFSOCK), fifo (S_IFIFO) или символьное устройство (S_IFCHR), это тоже подойдет.

Я уверен, что любойЯдро будет иметь эту информацию в свободном доступе, и мне интересно, можно ли ее отобразить в пользовательском пространстве без блокировки.

Переносное решение (по крайней мере, для MacOS и Linux) будет высоко оценено.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 01 ноября 2019

Вы можете использовать команду 'lsof' в неблокирующем режиме с аргументами '-b'. Этот аргумент заставит lsof избегать функций ядра, которые могут блокироваться. Например:

sudo lsof -b | less
COMMAND     PID   TID            USER   FD      TYPE             DEVICE    SIZE/OFF     NODE NAME
systemd       1                  root  cwd       DIR                8,1        4096          2 /
systemd       1                  root  rtd       DIR                8,1        4096          2 /
systemd       1                  root  txt       REG                8,1     1595792      19245 /lib/systemd/systemd

Тип файла даст вам тип файла. Вы можете передать это с помощью grep, чтобы получить информацию о вашем файловом дескрипторе,

sudo lsof -b | grep <your file descriptor>

Или есть много аргументов, которые позволят вам настроить операции lsof.

И для независимости от платформы,Это платформы, на которых поддерживается lsof: -

 Apple Darwin 9 and Mac OS X 10.[567]
 FreeBSD 8.[234], 9.0, 10.0 and 11.0 for AMD64-based systems
 Linux 2.1.72 and above for x86-based systems
 Solaris 9, 10 and 11
0 голосов
/ 12 октября 2019

В Linux вы можете посмотреть proc псевдофайловую систему , /proc/<pid>/fd, например:

[max@supernova:/proc/7275/fd] $ ls -l /proc/7275/fd/
total 0
lr-x------ 1 max max 64 Oct 12 16:28 0 -> /dev/null
l-wx------ 1 max max 64 Oct 12 16:28 1 -> 'pipe:[69689]'
lrwx------ 1 max max 64 Oct 12 16:28 10 -> 'socket:[69698]'
l-wx------ 1 max max 64 Oct 12 16:28 100 -> '/home/max/.config/google-chrome/Default/Service Worker/Database/MANIFEST-000001'
lr-x------ 1 max max 64 Oct 12 16:28 101 -> '/home/max/.config/google-chrome/Default/Sync Data/LevelDB/001633.ldb'
l-wx------ 1 max max 64 Oct 12 16:28 102 -> '/home/max/.config/google-chrome/Default/Service Worker/Database/000024.log'
lr-x------ 1 max max 64 Oct 12 16:28 103 -> '/home/max/.config/google-chrome/Default/Service Worker/Database/000022.ldb'
lr-x------ 1 max max 64 Oct 12 16:28 104 -> /opt/google/chrome/nacl_irt_x86_64.nexe
lr-x------ 1 max max 64 Oct 12 16:28 105 -> '/home/max/.config/google-chrome/Default/Service Worker/Database/000005.ldb'
lr-x------ 1 max max 64 Oct 12 16:28 106 -> '/home/max/.config/google-chrome/Default/Service Worker/Database/000025.ldb'
lr-x------ 1 max max 64 Oct 12 16:28 107 -> '/home/max/.config/google-chrome/Default/Service Worker/Database/000019.ldb'
lrwx------ 1 max max 64 Oct 12 16:28 108 -> 'socket:[89401]'
lrwx------ 1 max max 64 Oct 12 16:28 109 -> 'socket:[68628]'
lrwx------ 1 max max 64 Oct 12 16:28 11 -> 'anon_inode:[eventfd]'
...