Linux에 대한이 질문을 읽었습니다 . 프로세스가 종료되면 포트를 바인딩 할 수 있습니까?
프로세스가 종료되고 열린 소켓을 떠난 후 Linux가 정리 된 것으로 나타납니다. 이것이 Windows에서 어떻게 작동하는지에 대한 사양이 있는지 궁금합니다. OS는 소켓을 닫지 않고 종료하는 프로세스에 대해 소켓을 지속적으로 처리합니까?
Linux에 대한이 질문을 읽었습니다 . 프로세스가 종료되면 포트를 바인딩 할 수 있습니까?
프로세스가 종료되고 열린 소켓을 떠난 후 Linux가 정리 된 것으로 나타납니다. 이것이 Windows에서 어떻게 작동하는지에 대한 사양이 있는지 궁금합니다. OS는 소켓을 닫지 않고 종료하는 프로세스에 대해 소켓을 지속적으로 처리합니까?
답변:
Windows와 Unixen에서 프로세스가 종료되면 커널은 열려있는 모든 핸들을 닫습니다.
프로세스 종료 – MSDN
프로세스를 종료하면 다음과 같은 결과가 나타납니다.
- [...]
- 프로세스에서 할당 한 모든 리소스가 해제됩니다.
- 모든 커널 객체가 닫힙니다.
- [...]
프로세스가 종료되면 커널 객체에 대한 열린 핸들이 자동으로 닫히지 만 객체에 대한 모든 열린 핸들이 닫힐 때까지 객체 자체가 존재합니다. 따라서 다른 프로세스에 열린 핸들이 있으면 사용중인 프로세스가 종료 된 후에도 개체는 계속 유효합니다.
ExitProcess
기능 – MSDN프로세스를 종료하면 다음이 발생합니다.
- [...]
- 프로세스에 의해 열린 모든 개체 핸들이 닫힙니다.
- [...]
exit(3)
– Linux 프로그래머 매뉴얼 (libc 기능)열려있는 모든 stdio (3) 스트림이 플러시되고 닫힙니다.
_exit(2)
– Linux 프로그래머 매뉴얼 (커널 시스템 콜)이 함수
_exit()
는 "즉시"호출 프로세스를 종료합니다. 프로세스에 속하는 열린 파일 디스크립터가 닫힙니다. 프로세스의 모든 하위는 프로세스 1, init에 의해 상속되며 프로세스의 상위는 SIGCHLD 신호를받습니다.
두 운영 체제 모두에서
소켓은 파일 디스크립터 (fd) / 커널 객체의 한 유형일 뿐이므로 위의 내용은 파일과 소켓에 동일하게 적용됩니다.
파일 유닉스에 대한 설명뿐만 아니라 객체 핸들 Windows의 커널 오브젝트는, 소유 할 수 여러 프로세스 - 그들은 자신의 핸들은 자식 프로세스에 의해 상속, 심지어 특별한 IPC 기능을 사용하여 주위에 전달 될 수 있습니다.
파일이나 소켓은 그것을 가리키는 모든 fd가 파괴 될 때만 닫힙니다 .
Windows에서 소켓은 통신 엔드 포인트와 프로세스 간의 링크입니다. 소켓을 복제 할 때 소켓이 두 개이고 끝 점이 하나 뿐인 이유입니다. 그렇기 때문에 다른 프로세스에서 새 소켓을 만들지 않고 한 프로세스에서 다른 프로세스로 소켓을 전달할 수 없습니다.
프로세스가 존재하지 않으면 해당 소켓은 반드시 존재하지 않습니다. 소켓을 보유 할 프로세스가없는 소켓의 개념은 없습니다. 커널 레벨에서 소켓을 작성하려는 Windows 커널 드라이버 조차도 소켓 을 소유 할 프로세스를 지정하거나 소켓을 소유 할 수있는 프로세스 컨텍스트에서 함수를 호출해야합니다. 또는 소켓을 사용하지 않고 엔드 포인트를 직접 조작 할 수 있습니다.
귀하의 질문은 실제로 소켓이 아니라 통신 끝점 자체에 관한 것 같습니다. 소켓에는 통신 엔드 포인트에 대한 참조가 있습니다. 소켓이 사라지면 참조 카운트가 떨어집니다. 0에 도달하면 엔드 포인트와 연관된 통신 프로토콜의 요구 사항에 따라 허용되는 즉시 제거됩니다. TCP는 "남은"패킷을 처리하기 위해 엔드 포인트를 유지해야하는 TIME_WAIT 상태입니다.
그렇습니다. 이런 식으로 Windows 3.1 95 98 XP를 감지했습니다 (적어도 XP 이후로는 확실합니다).
WSACleanup()
. DOS-Windows 9x에는 MSKB 기사 # 156319에 문서화되어 있으며 부모 프로세스가 소켓에 대해 DOS-Windows의 프로세스 종료 시맨틱이 다르기 때문에 자식에게 전달 된 소켓을 무효화하는 잘못된 프로세스가있었습니다.