![어떻게 이루어지는가](https://linux55.com/image/169187/%EC%96%B4%EB%96%BB%EA%B2%8C%20%EC%9D%B4%EB%A3%A8%EC%96%B4%EC%A7%80%EB%8A%94%EA%B0%80.png)
어떻게인트라넷제어권을 서비스로 이전합니다. 아래는 제가 이해한 것입니다.
- 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
sfd
는 여전히 열려 있습니다. - 이제 서비스가 실행 중이며 원격 클라이언트가 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