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

조회수 3416회

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

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

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

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

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

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

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

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)