2009-11-12 3 views
0

C++ 서버 프로그램에서 문제가 있습니다. 요청 XML은 프론트 엔드 (Java)에서 왔고 백엔드 서버 (C++)는 요청을 처리하고 응답 XML을 리턴합니다.프런트 엔드 Tomcat이 종료되면 C++ Server가 종료됩니다. 오류 "수신되지 않은 신호 [13] - SIGPIPE"

백엔드에 대한 요청을 제출 한 후 테스트의 일부로 우리는 Tomcat 서버를 삭제했습니다. 요청을 처리 한 후 백엔드 어플리케이션 (스레드 된 서버 어플리케이션)이 Tomcat 서버가 다운되었을 때 응답을 보내지 못했습니다. 서버는 "수신되지 않은 신호 [13] - [SIGPIPE]"오류를 던집니다. 우리는 sigalrm 및 sigterm 기능을 구현했습니다.

위의 신호 오류는 캡처되지 않습니다. sigaction이 도움이됩니까? 또한 일단 신호가 캡처되면 서버가 듣고있는 메인 루프로 돌아 가기 위해 수행해야 할 작업이 있습니까?

편집 :

우리는 송신() 함수는 매개 변수 MSG_NOSIGNAL을 가진 것을 발견했다. 이 매개 변수를 전달할 때 연결이 종료되면 send 함수는 SIGPIPE 신호를 던지지 않습니다.

답변

2

단지 신호 무시되는 가장 쉬운 일이 :

struct sigaction new_action, old_action; 

/* Set up the structure to specify the new action. */ 
new_action.sa_handler = SIG_IGN; 
sigemptyset (&new_action.sa_mask); 
new_action.sa_flags = 0; 

sigaction(SIGPIPE, &new_action, &old_action); 

이렇게되면, 읽기 또는 쓰기가이 신호를 일으키는 전화를, 지금은 오류 및 코드 요구에 복귀 예정 그것을 처리 할 준비를해야합니다.