저는 신호 및 신호 처리기를 처음 접했고 다음과 같은 책을 읽고 있습니다.
핸들러에서는 비동기 신호 안전 함수만 호출하세요. 비동기 신호 안전 또는 단순 안전 함수에는 신호 처리기에 의해 중단될 수 없다는 점에서 신호 처리기에서 안전하게 호출할 수 있다는 속성이 있습니다. printf, sprintf, malloc 및 종료와 같은 널리 사용되는 많은 기능은 안전하지 않습니다.
나는 여기서 약간 혼란스러워합니다. 내 질문은 다음과 같습니다.
안전 기능이 신호 처리기에 의해 중단될 수 없다는 것은 무엇을 의미합니까? 이는 안전 기능이 시작될 때 내부적으로 신호를 차단하고 완료되기 전에 신호 차단을 해제하여 안전 기능이 다른 신호에 의해 중단되지 않는다는 것을 의미합니까?
답변1
커널이 프로세스에 신호를 전달할 때 프로세스의 실행을 중지하고(프로세스가 어디에 있든) 신호 처리기 함수에 대한 호출을 삽입한 다음 신호 처리기를 실행하도록 프로세스를 예약합니다. 호출은 어디에서나 주입될 수 있으므로 신호 처리기가 주입될 때 프로그램이 로컬이 아닌 상태를 조작할 수 있습니다. 이 비로컬 상태에 의존하는 다른 함수를 호출하면 정의되지 않은 동작이 발생합니다.
비로컬 상태에 액세스/수정하는 모든 기능은 일반적으로 신호로부터 안전하지 않습니다. 에서 man 7 signal-safety
:
To avoid problems with unsafe functions, there are two possible choices: 1. Ensure that (a) the signal handler calls only async-signal-safe functions, and (b) the signal handler itself is reentrant with respect to global variables in the main program. 2. Block signal delivery in the main program when calling functions that are unsafe or operating on global data that is also accessed by the signal handler. Generally, the second choice is difficult in programs of any complexity, so the first choice is taken.
매뉴얼 페이지는 계속해서 신호 안전 기능 세트를 나열합니다.