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 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

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