어떻게 이루어지는가

어떻게 이루어지는가

어떻게인트라넷제어권을 서비스로 이전합니다. 아래는 제가 이해한 것입니다.

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

내 질문은 다음과 같습니다

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

답변1

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

어떻게 이루어지는가

  • accept일단 연결되면 그 중 하나에 소켓이 있습니다 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

관련 정보