Linux에 TCP 서버 프로세스가 있습니다. 때로는 종료될 수도 있으며 SIGKILL
그 후에 상위 프로세스가 다시 시작됩니다. 나는 아이들이 죽는 방식을 바꿀 수 없습니다. 때때로(약 100회마다) 서버 포트가 아직 사용 중이기 때문에( bind
반환됨 EADDRINUSE
) 다시 시작이 실패합니다. 서버에서 명시적으로 설정한 소켓 옵션은 O_RDWR
, O_NONBLOCK
TCP_NODELAY
및 입니다.SO_REUSEADDR
TCP_USER_TIMEOUT
내 질문은 다음과 같습니다
비차단 TCP 소켓 작업이 있는 프로세스가 종료되면 해당 버퍼가 플러시되어
TIME_WAIT
상위 프로세스가 버퍼를 가져오기 전에 포트에 삽입 됩니까SIGCHILD
?상위 프로세스가
SIGCHILD
종료된 하위 프로세스를 획득하면 하위 프로세스가 사용하는 포트를 재사용할 수 있다는 것이 보장됩니까SO_REUSEADDR
?이 동작은 Linux 커널과 Mac마다 다릅니까?