질문: TCP 소켓을 사용하여 원격 프로그램에 연결하는 서버 프로그램을 실행하고 있습니다. 그 수가 많습니다(예: 20개). 내 문제는 소켓 설명자 중 하나가 손상되어 EOF가 수신된다는 것입니다. 그러나 프로그램의 버그로 인해 결코 닫히지 않고 대신 select() 컬렉션에 다시 추가되어 불필요한 고통을 야기합니다.
내가 그것을 찾기 위해 무엇을 했나요?:DDB에 연결하고 각각에 대해 read(fd,..)를 호출합니다. 잘못된 설명자는 0을 반환하고 거기에 도달했습니다.
이것이 나에게는 효과가 있지만 다른 소켓의 바이트를 낭비하고 다른 기능에서 오류가 발생할 수 있습니다.
내가 뭘 찾고 있는 거지?실행 중인 프로그램에 영향을 주지 않고 내 목적을 해결할 수 있는 비침해적 메커니즘을 이해하려고 했습니다.
그건 그렇고, 내 NetBSD 시스템은 tcsh만 이해합니다.
답변1
BSD 파생 시스템에서 다른 실행 프로세스에 열려 있는 파일 설명자를 조사하는 정식 방법은 fstat
(1) 명령( -p
해당 프로세스 ID를 지정하는 옵션 포함)을 사용하는 것입니다.
fstat
피어가 TCP 연결을 닫았는지 여부를 출력 에서 알 수 있습니다.
그러나 문제가 실제로 소스 코드가 있는 프로그램의 버그인 경우 -g
적절한 사용자 수준 디버거(예: 기본적으로 제공되는 gdb
.