Как этоинетдпередать управление сервису, ниже мое понимание
- inetd прослушивает каждый порт, упомянутый в
/etc/inetd.conf
- Если клиент делает запрос на один из портов, которые прослушивает inetd, то inetd передает управление этим запросом службе, запуская его как дочерний процесс, просматривая
/etc/inetd.conf
- Действует как мультиплексор.
Мои сомнения ниже
- Каким образом запрос передается дочернему процессу (соответствующему демону службы)?
- Inetd уже установил соединение на порту, поэтому дочерний процесс не может снова использовать этот порт, пока Inetd не освободит этот порт. Если Inetd освободит этот порт, то существующее клиентское соединение будет сброшено (поправьте меня, если я не так понимаю).
решение1
inetd
прослушивает порт, а затем подключает его к stdin, stdout и stderr службы, которая будет его обрабатывать.
Как это происходит?
- После
accept
подключения на одном из егоfd
концов появляется разъем. - Затем он
dup
дублируетfd
в0
,1
,и2
. - Затем он
fork
. Все файловые дескрипторы останутся открытыми, если только не будут предприняты какие-либо действия по их закрытию (поэтому 0,1 и 2 останутся открытыми). - Затем дочерний процесс вызовет
exec
,fd
но s все равно останется открытым. - Теперь служба работает с удаленным клиентом, подключенным к stdin (0), stdout (1) и stderr (2).
- Службе просто нужно знать, что клиент находится на этих файловых дескрипторах, и не делать ничего
listen
самостоятельно.
(Я поискал, но не нашел inetd
сообщения о том, что служебная программа была вызвана inetd
. Я ожидал бы аргумент командной строки.)
решение2
Рассмотрите такие действия:
[родитель]
sfd = socket(), listen(), connect(), fork();
Для других дескрипторов, которые не должны наследоваться дочерними процессами
close()
или предварительно установлены для них FD_CLOEXEC;
после fork
, родитель может закрыть этот sfd
[ребенок]
execve();
копия унаследованного дескриптора подключенного сокета, может использоваться для клиентского ввода-вывода
решение3
Это четко объяснено вQue-Linux-Socket-Программированиев разделеThe Design Parameters of inetd Servers