Scroll to navigation

proc_pid_fd(5) File Formats Manual proc_pid_fd(5)

ИМЯ

/proc/pid/fd/ - file descriptors

ОПИСАНИЕ

/proc/pid/fd/
Этот подкаталог содержит одну запись для каждого файла, открытого процессом, именем является номер его файлового дескриптора, и которая является символьной ссылкой на настоящий файл. Так, 0 — это стандартный поток ввода, 1 — стандартный поток вывода, 2 — стандартный поток ошибок и т.п.
Для файловых дескрипторов каналов и сокетов записи будут символьными ссылками, содержимое которых — тип файла и inode. Вызов readlink(2) для такого файла вернёт строку в формате:

type:[inode]
    

Например, socket:[2248868] — для сокета с inode 2248868. Для сокетов эту inode можно использовать для поиска дополнительной информации в одном из файлов в /proc/net/.
Для файловых дескриптор без соответствующей иноды (например, файловые дескрипторы, создаваемые bpf(2), epoll_create(2), eventfd(2), inotify_init(2), perf_event_open(2), signalfd(2), timerfd_create(2) и userfaultfd(2)), запись будет символьной ссылкой с содержимым в виде

anon_inode:тип-файла
    

Во многих случаях (но не всех) тип-файла заключается в квадратные скобки.
Например, файловый дескриптор epoll будет иметь символьную ссылку с содержимым в виде строки anon_inode:[eventpoll].
В многонитевых процессах, содержимое этого каталога недоступно, если главная нить уже завершила работу (обычно при помощи вызова pthread_exit(3)).
Программы, принимающие в аргументе командной строки имя файлы, не читают данные из стандартного ввода, если аргумент не указан, а программы, которые выполняют запись в файл с именем, указанным в аргументе командной строки, не пишут данные в стандартный вывод, если аргумент не указан, но, тем не менее, могут использовать стандартный ввод или вывод через файлы /proc/pid/fd, указанные в аргументе командной строки. Например, подразумевая что -i является флагом, обозначающим входной файл, и -o является флагом, обозначающим выходной файл, вы можете указать:

$ foobar -i /proc/self/fd/0 -o /proc/self/fd/1 …
    

и вы получите работающий фильтр.
/proc/self/fd/N — это примерно то же, что и /dev/fd/N на некоторых системах UNIX и подобных им. Фактически, большинство сценариев MAKEDEV в Linux создают символьную ссылку с именем /dev/fd на файл /proc/self/fd.
Большинство систем предоставляют символьные ссылки /dev/stdin, /dev/stdout и /dev/stderr, которые соответствуют ссылкам на файлы 0, 1 и 2 в /proc/self/fd. Так, пример указанной выше команды может быть переписан в следующем виде:

$ foobar -i /dev/stdin -o /dev/stdout ...
    

Право разыменовывать или читать (readlink(2)) символические ссылки в этом каталоге определяется проверкой режима доступа ptrace PTRACE_MODE_READ_FSCREDS; смотрите ptrace(2).
Заметим, что для файловых дескрипторов, указывающих на иноды (каналы и сокеты, смотрите выше), эти иноды по-прежнему имеют биты прав и информация о владельце отличается от имеющейся у /proc/pid/fd и этот владелец может отличаться от идентификатора пользователя и группы процесса. Непривилегированный процесс может не иметь прав на их открытие, как в этом примере:

$ echo test | sudo -u nobody cat
test
$ echo test | sudo -u nobody cat /proc/self/fd/0
cat: /proc/self/fd/0: Permission denied
    

Файловый дескриптор 0 указывает на канал, созданный оболочкой и принадлежащий владельцу оболочки, не nobody, поэтому у программы cat нет прав на создание нового файлового дескриптора для чтения из этой иноды, хотя при этом она всё-таки может читать из существующего файлового дескриптора 0.

СМОТРИТЕ ТАКЖЕ

proc(5)

ПЕРЕВОД

Русский перевод этой страницы руководства разработал Alexey, Azamat Hackimov <azamat.hackimov@gmail.com>, kogamatranslator49 <r.podarov@yandex.ru>, Darima Kogan <silverdk99@gmail.com>, Max Is <ismax799@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику по его адресу электронной почты или по адресу списка рассылки русских переводчиков.

2 мая 2024 г. Linux man-pages (unreleased)