어떻게inetd제어권을 서비스로 이전합니다. 아래는 제가 이해한 내용입니다.
- inetd는 언급된 모든 포트를 수신합니다.
/etc/inetd.conf
- 클라이언트가 inetd가 수신하는 포트 중 하나에 요청을 하면 inetd는 해당 요청에 대한 제어를 서비스에 전달하여 이를 하위 프로세스로 회전시킵니다.
/etc/inetd.conf
- 멀티플렉서 역할을 합니다.
내 의심은 아래에 있습니다.
- 요청이 하위 프로세스(각 서비스 데몬)로 어떻게 전달되나요?
- inetd에 의해 포트에 이미 연결이 설정되어 있으므로 inetd가 해당 포트를 해제할 때까지 하위 프로세스는 해당 포트를 다시 사용할 수 없습니다. inetd가 해당 포트를 해제하면 기존 클라이언트 연결이 끊어집니다(제 이해가 잘못된 경우 정정해 주시기 바랍니다).
답변1
inetd
포트에서 수신 대기한 다음 이를 처리할 서비스의 stdin, stdout 및 stderr에 연결합니다.
어떻게 합니까?
- 연결을 마친 후
accept
해당 s 중 하나에 소켓이 있습니다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