/proc/[pid]/fd/[0, 1, 2] :Нет такого файла или устройства -, хотя файл существует

man [бинарное имя] — полезный синтаксис для ввода в командной строке.

3
08.10.2020, 13:27
1 ответ

тл;др; С 2020 года вы не можете сделать это (или что-то подобное ), если /proc/<pid>/fd/<fd>является сокетом.

stdin, stdout, stderr процесса могут быть файлами любого типа, не обязательно каналами, обычными файлами и т. д. Они также могут быть сокетами.

В Linux /proc/<pid>/fd/<fd>— это особый вид символических ссылок, которые позволяют открывать с нуля фактический файл, на который ссылается файловый дескриптор, и делать это, даже если файл был удален., или он вообще никогда не присутствовал ни в какой файловой системе (, например файл, созданный с помощью memfd_create(2)).

Но сокеты являются заметным исключением, и они не могут быть открыты таким образом (и вообще не очевидно, как это может быть реализовано :будет ли open()на /proc/<pid>/fd/<fd>создавать другое соединение с сервером, если что fd - это подключенный сокет? что, если сокет явно привязан к локальному порту? ).

В последних версиях ядер Linux появился новый системный вызов pidfd_getfd(2), который позволяет вам «украсть» файловый дескриптор из другого процесса точно так же, как вы могли передать его через сокеты Unix, но без сотрудничество процесса жертвы.Но это еще не реализовано в большинстве дистрибутивов Linux.

4
18.03.2021, 22:59

Теги

Похожие вопросы