Как (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, что предоставляет возможность.