close(int fildesc) 메소드를 사용하여 네트워크 소켓을 닫을 때 어떤 상황에서 반환 값 -1이 생성될 수 있습니까? 잘못된 fildesc 번호를 사용하는 것이 가능하다고 생각하는데, 기존의 유효한 소켓을 사용하면 이런 일이 발생합니까?
이런 일이 발생하면 프로그램은 어떻게 반응해야 합니까?
답변1
리눅스 매뉴얼 페이지close()
유효한 파일 설명자에서 -1을 반환할 수 있는 몇 가지 사례를 설명합니다.
close()의 반환 값을 확인하지 않는 것은 일반적이지만 심각한 프로그래밍 오류입니다. 이전 write(2) 작업의 오류가 최종 close()에서 먼저 보고될 가능성이 높습니다. 파일을 닫을 때 반환 값을 확인하지 않으면 자동으로 데이터가 손실될 수 있습니다. 이는 특히 NFS 및 디스크 할당량에서 관찰됩니다.
이 부분은 리눅스 외에 다른 커널에도 적용되는 것 같아요. 그리고 다음과 같은 경고가 있습니다(강조).
반환 값은 진단에만 사용할 수 있습니다. 특히 EINTR 이후에 close()를 재시도하면 안 됩니다. 이렇게 하면 다른 스레드에서 재사용된 설명자가 닫힐 수 있기 때문입니다.
다음의 기본 원칙 중 일부를 읽어 보시기 바랍니다.이 lwn.net 기사:
close()에 전달된 파일 설명자는 시스템 호출 처리 초기에 할당 해제되며, close()가 반환될 때쯤에는 동일한 설명자가 다른 스레드에 배포되었을 수 있습니다.
따라서 소켓 설명자의 경우 EINTR
소켓을 닫을 때, 특히 소켓을 사용하여 많은 데이터를 보낸 후에 발생할 수 있지만안 돼요Linux에서는 다음과 같은 코드를 작성합니다.
while (close(sock) == -1 && errno == EINTR);