컨텐츠 바로가기

SIGPIPE (Broken pipe)

http://mirine35.egloos.com/5057019

파이프가 깨졌습니다(Broken pipe) 시그널은
소켓에서 다른 한쪽이 접속을 끊은 소켓에 대하여 쓰기 / 읽기 작업을 수행하려 할 때 발생한다.

이 시그널의 기본 액션은 프로세스 종료이므로 서버 프로세스는 이 시그널이

발생하면 종료된다.



서버 프로세스가 종료되지 않도록 하려면 signal(SIGPIPE, SIG_IGN) 을 사용하여 무시해버리던지, 아니면 적절한 시그널 핸들러를 만들어서 사용하면 된다.



출처 : http://blog.naver.com/dalmagru/70006842335


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실행시마다 기본으로 실행하게 됩니다.


출처 : http://nomoreid.egloos.com/1169779/


덧글|신고