Как только процесс имеет fork(2)
ed, дочерний и родительский процессы не разделяют таблицы дескрипторов файлов, поэтому операции в одной из них не влияют на другую. Специфичный для Linux системный вызов clone(2)
позволяет процессам совместно использовать таблицу дескрипторов файлов, используя CLONE_FILES
, а информация о файловой системе (корень файловой системы, текущий рабочий каталог, umask) может быть передана в CLONE_NS
. Использование clone(2)
может быть слишком большим, чтобы переписать для ваших целей - и поскольку это необычно, работать с ним может быть раздражающим.
Другой подход, предложенный bmargulies , заключается в создании части «сервера ошибок» родительского процесса, которая сообщает клиентам, какой порт connect(2)
предназначен для чтения информации об ошибках. Если вы придерживаетесь протокола TCP, он будет работать по сетям, но будет открыт для всех без некоторого кода аутентификации и авторизации. Если вы используете сокеты unix(7)
, вы можете использовать сообщения SCM_CREDENTIALS
для проверки пользователя, группы и pid процесса подключения.
Вы также можете создать новый pipe(7)
, используя системный вызов pipe(2)
для каждого дочернего элемента, до fork(2)
, и просто тратить файловые дескрипторы, если дочерний элемент не хотите отладочную информацию.
Если вы используете сокет unix(7)
для обеспечения связи между родителем и ребенком, вы можете использовать сообщение SCM_RIGHTS
для отправки дескриптора файла из одного процесса в другой - вы можете либо отправить родительский элемент pipe(7)
, либо socket(7)
ребенку для чтения или попросите ребенка отправить родителю pipe(7)
или socket(7)
для письма.