2017-02-25 3 views
1

옛 방식의 "신호"와 새로운 방식의 "sigaction": 우리 프로그램에서 SIG_KILL을 안전하게 처리 할 수 ​​있습니까? 거기에 다른 리눅스 커널 버전 사이의 차이점이 있습니까? 나는 2.6.30에서 더 높은 버전으로 업그레이드하려고 노력하고 있었고 개발 관점에서 알기 위해 SIG_KILL을 안전하게 처리 할 수 ​​있습니까?리눅스 시그널 SIG_KILL이 프로세스 sighandler에 의해 처리 될 수 있습니까?

+0

'man' : _ SIGKILL 또는 SIGSTOP을 차단할 수 없습니다. 그렇게하려는 시도는 무시됩니다 ._ –

답변

1

아니요. Matteo Piano가 지적했듯이 신호 처리기를 사용하여 SIGKILL을 처리 할 수있는 권한이 없습니다. 버그 버전이나 다른 비표준 버전에 대해 언급하지 않는 한 다른 커널 버전간에 차이점이 없어야합니다. man 7 signal의 "표준 신호"섹션에서

:

된 신호 SIGKILL과 SIGSTOP이 잡힌 차단되거나 무시 될 수 없다.

하나라도 충분하다면 Linux 커널 소스를 다운로드하여 원하는대로 변경할 수 있습니다. 그러나 나는 SIGKILL이 잡히는 것을 허용 할 것을 제안하지 않을 것이고 나는 그것을 "안전하다"라고 말하지 않을 것이다. 프로세스를 중지시키기 위해 하드웨어 재설정을 수행해야 할 필요가 없습니다.

당신이 SIGKILL을 잡을 싶어 왜 귀하의 질문에 지정하지 않기 때문에

, 대신 SIGHUP, SIGINT 또는 SIGQUIT 같은 다른 신호를 사용하는 것이 좋습니다. 이러한 다른 신호는 처리 될 가능성이 있으며 일부 Unix/Linux 프로그램이이를 처리합니다.

(SIGKILL을 잡기 위해) 또는 대상 프로세스가 종료되는지 여부를 감지하기 위해 프로세스를 둘러 볼 수도 있습니다. 예를 들어, 부모 프로세스는 자식 종료시 SIGCHLD 신호를 찾은 다음 신호 처리기에서 수행하려고했던 것과 동일한 이벤트를 효과적으로 발생시킬 수 있습니다.