2012-01-24 2 views
2

신호 처리기를 사용하는 올바른 방법은 무엇입니까?신호 처리기를 사용하는 올바른 방법

나는이 question에서 아래의 코드를 보았고 왜 여전히 signal(SIGSEGV,sig_func);을 sig_func에 넣어야하는지 궁금합니다. 프로세스가 SIGSEGV 신호를 수신 할 때 끊어지지 않는 루프를 생성하지 않을까요?

void sig_func(int sig) 
{ 
    write(1, "Caught signal 11\n", 17); 
    signal(SIGSEGV,sig_func); 
} 

int main() 
{ 


signal(SIGSEGV,sig_func); //Install the signal handler 

//Do work here 
} 

답변

3

signal manual 말한다 : 핸들러가 먼저 함수 sighandler 설정하거나 처리기 SIG_DFL하는 리셋 또는 경우

마지막 신호의 구현에 의존 차단이 수행 옆 sighandler는 인수 signum으로 호출됩니다.

signal에 반복 호출이 SIG_DFL으로 재설정되었다 (수) 이후에 사용자 정의 핸들러를 다시 설치하는 데 사용됩니다.

+0

man 페이지가'signal()의 유일한 휴대용 사용은 SIG_DFL 또는 SIG_IGN으로 신호 처리를 설정하는 것입니다. 신호 처리기를 설정하기 위해 signal()을 사용할 때의 의미는 시스템 (...)에 따라 다릅니다. ____이 목적을 위해 그것을 사용하지 마십시오 ____. POSIX.1은 명시 적 제어를 제공하는 sigaction (2)을 지정함으로써 이식성 난제를 해결했다. –

1

예를 들어, sig_funct에서 signal을 호출하면 이미 main에서 신호 처리기를 설정 했으므로 sig_funct에서 신호를 호출하는 것은 쓸모가 없으며 처리기에서 변경하지 않았습니다.

두 번째 질문을 고려하면 signal()은 신호 SIGSEGV의 처리를 처리기로 설정하지만 실행하지 않기 때문에 순환하지 않는 루프가 생성되지 않습니다.