Man page - proc_pid_fd(5)

Packages contains this manual

Available languages:

en fr pl ru ro de

Manual

proc_pid_fd

НАИМЕНОВАНИЕ
ОПИСАНИЕ
СМОТРИТЕ ТАКЖЕ
ПЕРЕВОД

НАИМЕНОВАНИЕ

/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> и Kirill Rekhov <krekhov.dev@gmail.com>

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

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