Linux Server개발 초창기에 프로그램을 돌리다보면 다음과 같은 에러메시지를 뱉어내면서 서버가 돌아가실때가 있습니다.
"Program received signal SIGPIPE, Broken pipe."
이미 연결이 종료된 Client에 Send하려했을때 나오는 signal로 처리해주지 않으면 기본 동작은 "프로그램 종료"라서. 서버가 다운되게 됩니다.
Unix System에서 발생하는 Signal들과 기본처리 방법들은
KELP쪽을 참고하십시요
하지만 서버의 경우 Client가 비정상적인 종료를 했을시 Broken pipe signal이 발생하고 Client의 종료를 서버에서 제어할 수 없기 때문에 해당 시그널을 무시하게 해주어야 합니다.
프로그램상에서 하는 방법은 다음과 같습니다.
#include < signal.h >해주고 main 함수후에 시작부분에
signal(SIGPIPE, SIG_IGN);코드를 넣어주면 됩니다. SIGPIPE 를 무시하라는 플래그를 셋팅해주는것이죠.
또 하나더..
위 서버 프로그램을 gdb로 돌릴때는 gdb에도 broken pipe 를 무시하는 옵션을 붙여줘야 합니다.
gdb 시작시
handle SIGPIPE nostop pass pass라고 해주거나 , 해당 프로그램을 돌리는 계정의 홈디렉토리에 .gdbinit 라는 파일을 만들고
위 내용을 넣어주면 gdb실행시마다 기본으로 실행하게 됩니다.