0xFF

C/C++에서 SIGPIPE 처리하기 본문

LINUX

C/C++에서 SIGPIPE 처리하기

캡스락 2026. 6. 23. 15:30

문제 발생 지점

cpp-httplib를 활용하여 로컬 영상 스트리밍을 테스트하던 중 서버가 불규칙적으로 잘 돌아가다가 죽는 문제를 확인했다.(약 30분~1시간 정도?)
처음에는 단순히 재시작하기만 했는데 몇 번 이상 같은 자리에서 반복하여 문제가 생기는 것을 확인하여 아무래도 수정이 필요할 것 같았다.

위의 send 함수에서 문제가 발생했는데 스택트레이스에는 SIGPIPE 시그널을 받았다고 나와 있었다.
SIGPIPE란 무엇일까? 아마 시그널의 한 종류인 것 같은데 manpage에서 찾아보자. 

man 7 signal 명령을 사용하면 이렇게 SIGPIPE의 정의를 확인할 수 있다.
"write to pipe with no readers."
즉, 리더가 없는 파이프에 쓰려고 한 경우 발생하는 시그널이라고 한다.
그렇다면 거의 확실히 클라이언트의 연결 문제일텐데, 이럴 때는 서버 프로그램이 죽을게 아니라 문제가 발생한 소켓만 닫도록 처리하는게 맞을 것 같다.

따라서 main.cpp에 SIGPIPE 핸들러로 SIG_IGN을 등록하여 해당 시그널이 무시되도록 한다.
다음으로 문제가 발생한 소켓은 메모리 누수가 생기지 않도록 반드시 정리해 주어야 하는데,

HTTP 서버 기능을 구현하기 위해 cpp-httplib라는 라이브러리를 사용하고 있어서 여기서 소켓 close가 어떻게 이루어지는지 확인 결과,

서버 인스턴스 생성(.start()) 후 listen을 처리하는 메서드에서 소켓과의 통신을 마치면 shutdown과 close가 무조건 처리되도록 하고 있어 여기까지 조치하는 것으로 마무리하였다.

여기서 shutdown과 close의 차이는?
close: 소켓과 파일 디스크립터 완전 제거
shutdown: 파일 디스크립터는 유지하면서 송신 or 수신 or 송수신을 차단함.
필자가 사용한 cpp-httplib는 shutdown 함수의 두번째 인자로 SHUT_RDWR을 사용하여 송수신을 모두 차단하는 방식으로 작동한다.

수정이 필요한 내용이 있다면 댓글로 알려주시면 감사하겠습니다.
이상입니다.