НАИМЕНОВАНИЕ
/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.
ПЕРЕВОД
Русский
перевод
этой
страницы
руководства
разработал(и)
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 или
более
поздней) в
отношении
авторского
права, но
БЕЗ
КАКИХ-ЛИБО
ГАРАНТИЙ.
Если вы
обнаружите
какие-либо
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
сообщите
об этом
разработчику(ам)
по его(их)
адресу(ам)
электронной
почты или
по адресу
списка
рассылки
русских
переводчиков.