APUE에서
프로세스에는 신호 처리를 위한 세 가지 옵션이 있습니다.
신호를 무시하세요. 이 옵션은 0으로 나누거나 프로세스 주소 공간 외부의 메모리 참조와 같은 하드웨어 예외를 나타내는 신호에는 권장되지 않습니다. 결과가 정의되지 않기 때문입니다.
기본 작업이 수행되도록 합니다. 0으로 나누는 경우 기본값은 프로세스를 종료하는 것입니다.
신호가 발생할 때 호출되는 함수를 제공합니다(이를 신호 "잡기"라고 합니다). 자체 기능을 제공함으로써 신호가 언제 발생하는지 알 수 있으며 원하는 대로 처리할 수 있습니다.
나는 두 가지 옵션만 있다고 생각합니다. 위에 나열된 마지막 두 개와 둘 다 "신호를 무시"할 수 있습니다(위에 나열된 첫 번째 옵션).
내 이해가 정확합니까, 아니면 실제로 견적에 겹치지 않는 세 가지 선택이 있습니까? 왜?
이 책에서는 일부 신호의 기본 동작은 이를 무시하는 것이라고 언급합니다. 이것은 신호의 동작이 SIG_IGN 또는 SIG_DFL이거나 빈 함수라는 것을 의미합니까? 예를 들어:
이것기본SIGCHLD의 작동은 다음과 같습니다.무시당하다. 이러한 옵션은 10장에서 설명합니다.
신호 제어: 기본 작업은 중지된 프로세스를 계속하는 것이지만, 소홀히 하다프로세스가 중지되지 않은 경우 신호를 보냅니다.
감사해요.
답변1
물론 아무것도 하지 않는 신호 처리기를 작성하여 신호를 효과적으로 무시할 수도 있지만 첫 번째 옵션은 시스템 호출 SIG_IGN
에 대한 인수를 사용하여 신호를 구체적으로 무시하는 것 입니다 signal()
.
따라서 코드 측면에서 SIGINT
신호를 가정하면 세 가지 옵션이 있습니다.
signal(SIGINT, SIG_IGN);
소홀히 하다- 함수 를 호출하지 마십시오 . 또는 프로세스를 종료하는 기본 동작이 발생하도록
signal()
호출 하지 마십시오.signal(SIGINT, SIG_DFL);
signal(SIGINT, termination_handler);
,termination_handler()
신호가 처음 발생할 때 호출되는 함수는 어디에 있습니까?
원천:https://www.gnu.org/software/libc/manual/html_node/Basic-Signal-Handling.html
특정 신호 사례의 경우 기본 작업은 신호를 무시하는 것이며 처음 두 옵션( SIG_IGN
및 SIG_DFL
)은 동일합니다. (작은) 오버헤드를 제외하면 빈 핸들러 함수를 생성해도 눈에 띄는 효과가 없을 수 있습니다.
참고: signal()
이 답변에서는 단순성을 위해 사용되었지만 sigaction()
이식성을 이유로 새 코드에서는 권장됩니다.