2010-07-05 2 views
3

간단한 서버 클라이언트 응용 프로그램을 작성하는 동안이 질문이 내 마음에 들었습니다. 누군가가 깨진 파이프에 쓰기를 시도하면 SIGPIPE가 생성됩니다. 내 코드에서 신호를 처리한다고 가정 해 보겠습니다.깨진 파이프에서 동작 보내기

EPIPE 또는 EINTR (신호에 의해 중단 된) 쓰기 호출이 반환하는 오류는 무엇입니까? 나는 샘플 프로그램을 가지고 시험해 보았고 나는 항상 EPIPE를 얻고있는 것 같다. 이것은 보장 된 행동입니까 아니면 두 가지 오류 값 중 하나 일 수 있습니까?

답변

2

는 POSIX는 EPIPE 반환해야하며, SIGPIPE가 전송 말한다 : 쓰기

  • () s 또는 PWRITE()의 파이프 나 FIFO를에 어떤 프로세스에 의해 읽기 위해 열거 나, 한쪽에만 개방하지.
  • 더 이상 연결되어 있지 않거나 쓰기 위해 종료 된 소켓에 대해 write()를 사용합니다.

당신은 here

+0

+1 POSIX 인용. –

1

write(2) 호출이 오류에 -1 반환 표준 POSIX에서보기를 할 수 있습니다, 그래서 당신은 errno(3)의 가치에 대해 묻는 것 같아요. 당신이, 블록, 또는 신호를 무시 처리 경우

당신은 EPIPE를 얻을 수 있습니다. 그렇지 않으면 프로세스가 기본적으로 종료됩니다 (signal(7) 참조). 일반적으로

0

는 프로세스가 시스템 통화 중 신호를받은 (및 처리) 경우 어떤 시스템 호출이 실패 할 수 있습니다 이로써 완전히 말도 유닉스 시스템 V 신호 처리를 의미한다 (EINTR) "신호에 의해 중단". 이것은 모든 시스템 호출을 do ... while (ret==-1 && errno==EINTR); 또는 이와 유사한 것으로 랩핑해야했다. POSIX는 여전히이 또는 좋은 ("BSD") 동작을 허용하지만 GNU/Linux 같은 정상적인 시스템은 기본적으로 BSD 동작을가집니다. 항상 올바른 인수를 사용하여 sigaction을 호출하여 BSD 동작을 얻을 수 있으며, 또는 그렇게 할 수있는 래퍼 기능을 만들 수도 있습니다.

이와 같이 EINTR은 쓰기 오류로 인한 SIGPIPE와 관련이 없습니다.