SIGPIPE에서도 서버를 유지하는 법
조회수 3416회
TCP나 local UNIX 소켓을 통해서 명령어를 입력받아 결과를 보내주는 서버를 만들었습니다.
가끔 클라이언트가 결과를 입력받기 전에 나가버려서 SIGPIPE
가 발생하는데 이때마다 서버가 죽어버립니다.
어떻게 하면 서버를 계속 살려놓을 수 있을까요?
소켓에 쓸 수 있는지 확인하고 써야 하나요? 아니면 SIGPIPE
를 catch
하고 아무것도 안하는 handler를 등록해야 될까요?
1 답변
-
보통 이런 경우
SIGPIPE
를 무시하고(catch하지도 않음) 바로바로 코드 안에서 에러를 처리해주는 방식을 씁니다.signal(SIGPIPE, SIG_IGN);
이 코드를 추가하면 쓸 수 없는 소켓/파이프에 뭔가 쓰더라도SIGPIPE
가 발생하지 않습니다.send()
함수를 쓰고 있다면MSG_NOSIGNAL
옵션을 주는 방법도 있습니다. 단, 모든 운영체제가MSG_NOSIGNAL
를 지원하는 건 아니니 미리 확인하고 써주세요,마지막으로,
setsockopt()
에서SO_SIGNOPIPE flag
를 설정하는 방법이 있습니다. 특정 소켓에서만SIGPIPE
를 무시하고 싶을 때 사용하는 방법입니다. 이 역시 모든 운영체제가 지원하는 방법은 아니기 때문에 미리 확인해보고 써주세요
댓글 입력