여기서 충돌을 방지하는 가장 좋은 방법은 무엇입니까?
모두에 따라 sigpipe를 비활성화하거나 오류를 포착하고 무시하십시오.
줄의 다른 쪽이 여전히 읽고 있는지 확인하는 방법이 있습니까?
예, select ()를 사용하십시오.
select ()는 소켓이 쓰기 가능하다는 것을 항상 나타 내기 때문에 여기서 작동하지 않는 것 같습니다.
읽기 비트 를 선택해야합니다 . 쓰기 비트 는 무시해도 됩니다.
파 엔드가 파일 핸들을 닫으면 선택하면 읽을 준비가 된 데이터가 있음을 알려줍니다. 당신이 그것을 읽을 때, 당신은 0 바이트를 다시 얻을 것입니다. 이것은 OS가 파일 핸들이 닫 혔음을 알려주는 방법입니다.
쓰기 비트를 무시할 수없는 유일한 시간은 대용량을 전송하는 경우이고 다른 쪽 끝이 백 로그 될 위험이있어 버퍼가 가득 찰 수 있습니다. 이 경우 파일 핸들에 쓰려고하면 프로그램 / 스레드가 차단되거나 실패 할 수 있습니다. 쓰기 전에 선택 테스트를하면 그로부터 보호 할 수 있지만 다른 쪽 끝이 건강하거나 데이터가 도착한다고 보장 할 수는 없습니다.
close ()와 쓸 때 sigpipe를 얻을 수 있습니다.
닫기는 버퍼링 된 데이터를 플러시합니다. 다른 쪽 끝이 이미 닫힌 경우 닫기가 실패하고 sigpipe를 받게됩니다.
버퍼링 된 TCPIP를 사용하는 경우 성공적인 쓰기는 데이터가 전송 대기 중임을 의미한다고해서 전송 된 것은 아닙니다. 닫기를 성공적으로 마치기 전까지는 데이터가 전송되었음을 알 수 없습니다.
Sigpipe는 무언가 잘못되었다고 말하고, 무엇을 어떻게해야하는지 알려주지 않습니다.