SIGPIPE에서도 서버를 유지하는 법


TCP나 local UNIX 소켓을 통해서 명령어를 입력받아 결과를 보내주는 서버를 만들었습니다. 가끔 클라이언트가 결과를 입력받기 전에 나가버려서 SIGPIPE가 발생하는데 이때마다 서버가 죽어버립니다.

어떻게 하면 서버를 계속 살려놓을 수 있을까요? 소켓에 쓸 수 있는지 확인하고 써야 하나요? 아니면 SIGPIPEcatch 하고 아무것도 안하는 handler를 등록해야 될까요?

  • 2016년 01월 29일에 작성됨

조회수 267


1 답변


좋아요
0
싫어요
채택취소하기

보통 이런 경우 SIGPIPE를 무시하고(catch하지도 않음) 바로바로 코드 안에서 에러를 처리해주는 방식을 씁니다.

signal(SIGPIPE, SIG_IGN); 이 코드를 추가하면 쓸 수 없는 소켓/파이프에 뭔가 쓰더라도 SIGPIPE가 발생하지 않습니다.

send()함수를 쓰고 있다면 MSG_NOSIGNAL 옵션을 주는 방법도 있습니다. 단, 모든 운영체제가 MSG_NOSIGNAL를 지원하는 건 아니니 미리 확인하고 써주세요,

마지막으로, setsockopt()에서 SO_SIGNOPIPE flag를 설정하는 방법이 있습니다. 특정 소켓에서만 SIGPIPE를 무시하고 싶을 때 사용하는 방법입니다. 이 역시 모든 운영체제가 지원하는 방법은 아니기 때문에 미리 확인해보고 써주세요

  • 2016년 01월 29일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close