2014-12-22 5 views
1

SIGPIPE 충돌 문제를 만났습니다. 로그에 기록하려고합니다.
그러나 나는 follow 코드를 통해 SIGPIPE를 잡을 수 없었다.
"kill -s 신호 처리"를 사용하여 코드를 확인하려고 시도하면 SIGINT, SIGSTOP, SIGSEGV 및 SIGALRM 신호와 함께 작동합니다.
그러나 SIGPIPE에서 실패했습니다.
여기에 무엇이든 놓치면 조언 해 주시겠습니까?
Ubuntu에서 SIGPIPE 신호를 잡을 수 없습니다.

void handle_pipe(int sig) 
{ 
    printf("SIG_PIPE happen, error code is %d", sig); 
    exit(0);  
} 

int main(int argc, char **argv) 
{ 
    struct sigaction action; 
    sigemptyset(&action.sa_mask); 
    action.sa_handler = handle_pipe; 
    action.sa_flags = 0; 
    //not work 
    sigaction(SIGPIPE, &action, NULL); //Not work with kill -13 process_id 
    //works well 
    sigaction(SIGINT, &action, NULL); //work with kill -2 process_id 
    sigaction(SIGSEGV, &action, NULL); //work with kill -11 process_id 
    sigaction(SIGALRM, &action, NULL); //work with kill -14 process_id 
    sigaction(SIGSTOP, &action, NULL); //work with kill -17 process_id 

    fooServer * pfooServer = new fooServer(); 
    while(1) 
    { 
     pfooServer->DoEvents(); 
    } 
    delete pfooServer; 
} 

내 환경은 우분투 12.04 LTS

답변

1

이 전체 코드 예제 킬 (kill) -13 작업 않습니다이다. 우분투 12.04 LTS를 테스트 할 수는 없지만 RHEL 6.5에서는 괜찮습니다. 이 시도. 예상대로 작동하면 "fooServer"에 SIGPIPE 동작을 변경하는 무언가가 있어야합니다.

#include <stdio.h> 
#include <unistd.h> 
#include <signal.h> 
#include <stdlib.h> 



void handle_pipe(int sig) 
{ 
    printf("SIG_PIPE happen, error code is %d", sig); 
    exit(0);  
} 

int main(int argc, char **argv) 
{ 
    struct sigaction action; 
    sigemptyset(&action.sa_mask); 
    action.sa_handler = handle_pipe; 
    action.sa_flags = 0; 
    //not work 
    sigaction(SIGPIPE, &action, NULL); //Not work with kill -13 process_id 
    //works well 
    sigaction(SIGINT, &action, NULL); //work with kill -2 process_id 
    sigaction(SIGSEGV, &action, NULL); //work with kill -11 process_id 
    sigaction(SIGALRM, &action, NULL); //work with kill -14 process_id 
    sigaction(SIGSTOP, &action, NULL); //work with kill -17 process_id 

    while(1) 
    { 
     sleep(1); 
    } 
} 
+0

안녕하세요. 감사합니다. fooServer에서 뭔가가 발생하는 것 같습니다. 하지만 fooServer가 타사 라이브러리이므로 fooServer 외부에서 이러한 종류의 신호를 잡을 수있는 제안이 있습니까? –

+1

''new fooServer()''를 만든 후에 sigaction을 호출 해 보시 겠어요? 시도해 볼만한 가치가 있습니다. – Vorsprung

+0

안녕하세요, Vorsprung, 감사합니다. 그것은 작동합니다. –