Я устал от ограничения "только один абзац" в комментариях =)
Если вы запустите shell sh
и получите pid $pid
вы сможете найти файловые дескрипторы, которые вы описываете. Пример:
$ ls -l /proc/29201/fd
total 0
lrwx------ 1 eroen users 64 Mar 22 15:52 0 -> /dev/pts/2
lrwx------ 1 eroen users 64 Mar 22 15:52 1 -> /dev/pts/2
lrwx------ 1 eroen users 64 Mar 22 15:52 2 -> /dev/pts/2
lrwx------ 1 eroen users 64 Mar 22 15:52 255 -> /dev/pts/2
Вы заметите, что 1
, 2
и 3
- все символические ссылки на один и тот же tty (chardev). Другими словами, входные данные процесса считываются с того же узла устройства, на который записываются выходные данные.
Когда вы пытаетесь записать (в другом процессе) в тот же tty (как /proc/$pid/fd/0
или /dev/pts/?
вы делаете то же самое, что и сам процесс, когда он записывает данные в свой вывод; данные отображаются в окне терминала.
На самом деле изменить точку fd [0-2] после запуска процесса довольно сложно, но не невозможно. Reptyr - это бесплатное приложение с открытым исходным кодом, которое модифицирует существующий процесс, так что fd [0-2] указывает на другой tty (а также некоторые другие вещи). Это достигается через структуру ptrace. В посте также упоминаются другие программы, которые делают то же самое, и что это можно сделать через gdb.
В зависимости от того, чего вы на самом деле хотели достичь, вы можете обнаружить, что Reptyr или другое программное обеспечение делает то, что вам нужно. В противном случае вы можете посмотреть / скопировать / изменить исходный код и узнать, как они справляются с задачей.
Приложение:
Это содержит несколько иллюстрирующих диаграмм, в частности третью схему сверху.