
APUE에서
프로세스에는 신호를 처리하기 위한 세 가지 선택 사항이 있습니다.
신호를 무시하세요. 0으로 나누거나 프로세스의 주소 공간 외부에 있는 메모리를 참조하는 등 하드웨어 예외를 나타내는 신호에는 결과가 정의되지 않으므로 이 옵션은 권장되지 않습니다.
기본 동작이 발생하도록 합니다. 0으로 나누기 조건의 경우 기본값은 프로세스를 종료하는 것입니다.
신호가 발생할 때 호출되는 함수를 제공합니다(이를 신호 '잡기'라고 합니다). 자체 기능을 제공함으로써 신호가 언제 발생하는지 알 수 있으며 원하는 대로 처리할 수 있습니다.
나는 두 가지 선택 밖에 없다고 생각합니다. 위에 나열된 마지막 두 개와 둘 다 "신호를 무시"할 수 있습니다(위에 나열된 첫 번째 선택).
내 이해가 정확합니까, 아니면 인용문에서와 같이 실제로 세 가지 겹치지 않는 선택이 있습니까? 왜?
이 책에서는 일부 신호의 기본 동작은 이를 무시하는 것이라고 언급합니다. 신호의 동작이 SIG_IGN, SIG_DFL 또는 빈 함수라는 뜻인가요? 예를 들어:
그만큼기본SIGCHLD에 대한 조치는 다음과 같습니다.무시됨. 이러한 옵션은 10장에서 설명합니다.
SIGCONT: 기본 조치는 중지된 프로세스를 계속하는 것이지만 무시하다프로세스가 중지되지 않은 경우 신호입니다.
감사해요.
답변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()
이식성을 이유로 새 코드에서는 권장됩니다.