Broken pipe 에러 대처법.
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실행시마다 기본으로 실행하게 됩니다.
by 우주괴물 | 2005/04/07 13:10 | Linux | 트랙백(2) | 덧글(1)
트랙백 주소 : http://nomoreid.egloos.com/tb/1169779
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from Lagoons.net at 2007/05/14 10:26

제목 : 유닉스 SIGPIPE 시그널.
gdb로 디버깅시 "Program received signal SIGPIPE, Broken pipe."같은 메세지가 나오면서 자꾸 브레이크가 되길래 검색해보니...http://nomoreid.egloos.com/1169779오 경만옹께서 적어두신 내용이 있음. 이미 연결이 종료된 Client에 Send하려했을때 나오는 signal음 그러쿠나.gdb에서 해당 시그널을 무시하게 할려면 handle SIGPIPE nostop pass pass을 gd......more

Tracked from 바람부는 날 at 2009/04/15 16:02

제목 : signal( SIGPIPE, SIG_IGN )
Broken pipe 에러 대처법. Windows라면 단지 Send 실패에 대한 에러 코드를 받고 끝날 것인데 Linux는 이렇게 다르군... +_+! (좋은 정보 감사합니다!! &gt;ㅂ&lt;)...more

Commented by 금동 at 2008/03/24 00:01
한가지 물음있는데요.
시험해보니까 일단 파이프깨짐이 발생하면 다른 클라이언트도 접속하지 못하더군요.
이럴땐 어떡하죠?

:         :

:

비공개 덧글



< 이전페이지 다음페이지 >