파이프 파손 오류의 원인은 무엇입니까?


84

피어 측의 소켓이 닫히면 깨진 파이프 오류가 발생한다는 것을 알고 있습니다.

그러나 내 테스트에서 피어 측이 닫힐 때이 측에서 즉각적인 '보내기'호출이 항상 파이프 오류로 이어지지는 않는다는 점에 주목했습니다.

예 :

피어 측에서 소켓을 닫은 후 (close를 호출하여 깨끗한 닫고 피어를 죽여서 비정상적인 닫는 것을 시도했습니다) 40 바이트를 보내려고하면 끊어진 파이프가 나타나지 않지만 시도하면 40000 바이트를 보내면 즉시 깨진 파이프 오류가 발생합니다.

파이프 파손의 원인은 정확히 무엇이며 그 동작을 예측할 수 있습니까?

답변:


59

네트워크가 닫히는 것을 관찰하는 데 시간이 걸릴 수 있습니다. 전체 시간은 포트로 향하는 패킷이 모두 죽은 것으로 간주되기 전에 닫은 후 명목상 약 2 분 (예, 분!)입니다. 오류 조건은 어느 시점에서 감지됩니다. 작은 쓰기를 사용하면 시스템의 MTU 내부에 있으므로 메시지가 전송 대기열에 추가됩니다. 큰 쓰기를 사용하면 MTU보다 크고 시스템이 문제를 더 빨리 발견합니다. SIGPIPE 신호를 무시하면 함수가 끊어진 파이프에 대해 EPIPE 오류를 반환합니다 (연결의 끊어짐이 감지되는 특정 지점에서).


4
@varevarao : 전송을 큐잉하고 특정 간격으로 보내는 것이 해결 방법이라고 생각하지 않습니다. 보낼 MTU보다 많을 때까지 전송을 큐에 저장하는 것은 응용 프로그램이 지연을 겪을 수있는 경우 해결 방법이 될 수 있습니다.
Jonathan Leffler

11

소켓의 현재 상태는 'keep-alive'활동에 의해 결정됩니다. 귀하의 경우에는 send호출을 발행 할 때 keep-alive활동이 소켓이 활성 상태임을 알려주므로 send호출이 필요한 데이터 (40 바이트)를 버퍼에 쓰고 오류없이 반환 될 수 있습니다.

더 큰 청크를 보낼 때 send 호출은 차단 상태가됩니다.

send man 페이지에서도이를 확인합니다.

메시지가 소켓의 송신 버퍼에 맞지 않으면 소켓이 비 차단 I / O 모드에 있지 않는 한 send ()는 정상적으로 차단됩니다. 비 차단 모드에서는이 경우 EAGAIN을 반환합니다.

따라서 사용 가능한 사용 가능한 버퍼를 차단하는 동안 호출자에게 다른 쪽 끝이 더 이상 존재하지 않는다는 알림 (연결 유지 메커니즘에 의해)이 표시되면 전송 호출이 실패합니다.

언급 된 정보로는 정확한 시나리오를 예측하는 것이 어렵지만 이것이 문제의 원인이라고 생각합니다.


1
소켓의 현재 상태는 ACK 활동에 의해 관찰됩니다. Keepalive는 하나의 사소한 소스 ACK 활동 일 뿐이며 기본적으로 꺼져 있습니다.
Marquis of Lorne

3

40 바이트는 파이프 버퍼에 맞지만 40000 바이트는 맞지 않을까요?

편집하다:

전송 프로세스는 닫힌 파이프에 쓰려고 할 때 SIGPIPE 신호를 보냅니다. 신호가 언제 전송되는지, 파이프 버퍼가 이것에 어떤 영향을 미치는지 정확히 알지 못합니다. sigaction 호출로 신호를 트래핑하여 복구 할 수 있습니다.


0

피어가 닫히면 전송을 중지하는지 또는 전송과 수신을 모두 중지하는지 알 수 없습니다 .TCP가이를 허용하기 때문에 btw, 닫기와 종료의 차이를 알아야합니다. 피어가 보내기와 받기를 모두 중지하면 먼저 몇 바이트를 보내면 성공합니다. 그러나 피어 커널은 RST를 보냅니다. 따라서 이후에 몇 바이트를 보내면 커널이 SIGPIPE 신호를 보냅니다.이 신호를 포착하거나 무시하면 전송이 반환되면 Broken pipe 오류가 발생합니다. 그렇지 않으면 프로그램의 기본 동작이 충돌합니다. .


-1

새 네트워크를 배치 한 후 Broken Pipe 오류가 발생했습니다. 포트 9100이 열려 있고 텔넷 포트 9100을 통해 프린터에 연결할 수 있는지 확인한 후 프린터 드라이버를 "HP"에서 "일반 PDF"로 변경하고 깨진 파이프 오류가 사라지고 성공적으로 인쇄 할 수있었습니다.

(RHEL 7, 프린터는 Ricoh 브랜드 였고, HP 구성은 기존 네트워크에서 이미 존재하고 작동했습니다.)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.