어떻게 합니까?

어떻게 합니까?

어떻게inetd제어권을 서비스로 이전합니다. 아래는 제가 이해한 내용입니다.

  • inetd는 언급된 모든 포트를 수신합니다./etc/inetd.conf
  • 클라이언트가 inetd가 수신하는 포트 중 하나에 요청을 하면 inetd는 해당 요청에 대한 제어를 서비스에 전달하여 이를 하위 프로세스로 회전시킵니다./etc/inetd.conf
  • 멀티플렉서 역할을 합니다.

내 의심은 아래에 있습니다.

  • 요청이 하위 프로세스(각 서비스 데몬)로 어떻게 전달되나요?
  • inetd에 의해 포트에 이미 연결이 설정되어 있으므로 inetd가 해당 포트를 해제할 때까지 하위 프로세스는 해당 포트를 다시 사용할 수 없습니다. inetd가 해당 포트를 해제하면 기존 클라이언트 연결이 끊어집니다(제 이해가 잘못된 경우 정정해 주시기 바랍니다).

답변1

inetd포트에서 수신 대기한 다음 이를 처리할 서비스의 stdin, stdout 및 stderr에 연결합니다.

어떻게 합니까?

  • 연결을 마친 후 accept해당 s 중 하나에 소켓이 있습니다 fd.
  • 그런 다음 , 및 을 dup연결 합니다 .fd012
  • 그러면 됩니다 fork. 모든 파일 설명자는 파일을 닫는 조치를 취하지 않는 한 열린 상태로 유지됩니다(따라서 0,1, 2는 열린 상태로 유지됩니다).
  • 그런 다음 하위 프로세스는 을 호출하고 execs fd는 여전히 열려 있습니다.
  • 이제 서비스는 stdin(0), stdout(1) 및 stderr(2)에 연결된 원격 클라이언트로 실행됩니다.
  • 서비스는 클라이언트가 이러한 파일 설명자에 있다는 것만 알아야 하며 listen자체 작업을 수행하지는 않습니다.

(일부 검색을 했지만 inetd에 의해 호출되었다는 서비스 프로그램을 알 수 없습니다 inetd. 명령줄 인수가 필요할 것입니다.)

답변2

다음과 같은 조치를 고려하십시오.

[부모의]

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

하위 프로세스에서 상속해서는 안 되는 다른 설명자 또는 이전에 after close()로 설정한 경우 상위는 이 sfd를 닫을 수 있습니다.FD_CLOEXEC;fork

[어린이]

execve();연결된 소켓 설명자의 복사본이 상속되어 클라이언트 I/O에 사용할 수 있습니다.

답변3

에 친절하게 설명되어 있어요Que-Linux-소켓 프로그래밍섹션 아래The Design Parameters of inetd Servers

관련 정보