Como isso acontece

Como isso acontece

Como é queinetdtransferir o controle para o serviço, abaixo está meu entendimento

  • inetd escuta em todas as portas mencionadas em/etc/inetd.conf
  • Se um cliente fizer uma solicitação para uma das portas que o inetd escuta, então o inetd transfere o controle dessa solicitação para um serviço, girando-o como um processo filho, olhando/etc/inetd.conf
  • Ele atua como multiplexador.

Minha dúvida está abaixo

  • Como a solicitação é transferida para o processo filho (respectivo daemon de serviço)?
  • A conexão já é feita na porta pelo inetd, então o processo filho não pode acessar aquela porta novamente até que o inetd libere essa porta. Se o inetd liberar essa porta, a conexão do cliente existente será interrompida (corrija-me se meu entendimento estiver errado).

Responder1

inetdescuta em uma porta e, em seguida, conecta-a ​​ao stdin, stdout e stderr do serviço que irá processá-la.

Como isso acontece

  • Após accepta conexão, ele possui um soquete em um de seus fds.
  • Em seguida, ele duplicará fdto 0, 1,e 2.
  • Será então fork. Todos os descritores de arquivo permanecerão abertos, a menos que alguma ação seja tomada para fechá-los (portanto, 0,1 e 2 permanecem abertos).
  • O processo filho então chamará exec, fds ainda permanecerão abertos.
  • O serviço agora está sendo executado com o cliente remoto conectado a stdin (0), stdout (1) e stderr (2).
  • O serviço só precisa saber que o cliente está nesses descritores de arquivo, e não fazer isso listenpor conta própria.

(Fiz algumas pesquisas, mas não consigo inetddizer ao programa de serviço que ele foi chamado por inetd. Eu esperaria um argumento de linha de comando.)

Responder2

Considere ações como esta:

[pai]

sfd = socket(), listen(), connect(), fork();

Para outros descritores que não devem ser herdados por processos filhos, close()ou previamente definidos como FD_CLOEXEC;after fork, o pai pode fechar este sfd

[criança]

execve();cópia do descritor de soquete conectado herdado, pode ser usado para E/S do cliente

Responder3

Está bem explicado emProgramação Que-Linux-Socketsob a seçãoThe Design Parameters of inetd Servers

informação relacionada