тл;др; С 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.