Как (x)inetd "разделяет" подключенный сокет на STDIN/STDOUT/STDERR?

Я предполагаю, что (x)inetd работает как большинство демонов, в том случае, если accept()При подключении к порту осуществляется мониторинг, создается сокет. Как-то, правда, до этого fork()с и exec()Являясь целевой сервисной программой, ей удается преобразовать этот двунаправленный сокет в три стандартных дескриптора ввода-вывода STDIN, STDOUT и STDERR.

Я спрашивал вокруг, как победить это поведение, не катя мою собственную версию inetd, но безуспешно. Мне пришло в голову задавать вопрос таким образом, потому что это могло бы дать подсказку о том, как я мог бы затем "соединить" файловые дескрипторы 0, 1 и 2 в один сокет.

Причина, по которой я хочу, чтобы служебная программа взаимодействовала в двух направлениях через один сокет, заключается в том, что ей необходимо использовать инфраструктуру ввода-вывода, основанную на одном двунаправленном сокете.

1 ответ

Входящие данные на сервер inet.d будут сопоставлены с stdin, а fprintf(stdout) и fprintf(stderr) обработчика inet.d будут отправлены обратно клиенту путем объединения в один поток.

Здесь проблема в том, что клиент telnet не может различить потоки stdout и stderr. При необходимости используйте ssh вместо telnet, что предоставляет возможность.

Другие вопросы по тегам