Как это происходит?

Как это происходит?

Как этоинетдпередать управление сервису, ниже мое понимание

  • inetd прослушивает каждый порт, упомянутый в/etc/inetd.conf
  • Если клиент делает запрос на один из портов, которые прослушивает inetd, то inetd передает управление этим запросом службе, запуская его как дочерний процесс, просматривая/etc/inetd.conf
  • Действует как мультиплексор.

Мои сомнения ниже

  • Каким образом запрос передается дочернему процессу (соответствующему демону службы)?
  • Inetd уже установил соединение на порту, поэтому дочерний процесс не может снова использовать этот порт, пока Inetd не освободит этот порт. Если Inetd освободит этот порт, то существующее клиентское соединение будет сброшено (поправьте меня, если я не так понимаю).

решение1

inetdпрослушивает порт, а затем подключает его к stdin, stdout и stderr службы, которая будет его обрабатывать.

Как это происходит?

  • После acceptподключения на одном из его fdконцов появляется разъем.
  • Затем он dupдублирует fdв 0, 12.
  • Затем он 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

Связанный контент