내 질문은 신호와 운영 체제 커널 내부의 처리에 관한 것입니다.
각 프로세스에는 자체 signal_handler()
테이블이 있다는 것을 알고 있습니다. 31비트 신호 배열( pending_signals
), 신호가 도착하면 do_signal()이 호출되어 signal_handler()
커널 모드가 아닌 사용자 모드에서 실행되는 관련 루틴을 호출합니다. 그런데 무슨 일이 일어나고 있나요?).
프로세스가 일부 신호를 수신한다고 가정합니다. 즉, 신호 배열의 비트가 켜져 있고 누가 해당 배열에 기록하고 있는지 가정합니다(이것이 신호를 호출한 프로세스인 것 같습니다. 현재 우리가 겪고 있는 프로세스입니다). 과정은 다음과 같습니다:
A
신호를 호출하고 이를 B
신호 배열에 쓴 다음(사용자 모드로 돌아가기 전?) 동일한 컨텍스트에서(B로 전환하지 않고) 해당 신호에 대한 특정 신호 처리기를 호출합니다 B
(언제 사용자 모드로 전환합니까?). 돌아가서 A
일정을 변경하고 계속해야 하는지 확인합니다.
두 번째는 신호가 다음과 같을 때 일어나는 일입니다 . 제 생각에는 이것이 하위 프로세스 호출 어딘가에서 SIG_CHILD
일어나야 한다고 생각합니다 .do_exit()
마지막 것은 어떻게 waitpid(pid_t num)
작동합니까?
아버지는 어떻게 SIG_CHILD
다른 아들들의 신호를 모두 무시하고 특정 아들에게만 관심을 가질 수 있습니까?
다음 내용을 읽어볼 수 있는 좋은 출처가 있으면 좋겠습니다(해당 출처는 발견되지 않았습니다).
답변1
귀하의 질문을 읽는 동안. 신호 처리기 B
가 A
. 이것은 옳지 않은 것 같습니다. 이로 인해 보안 취약점이 발생할 수 있습니다. 신호 처리기는 항상 소유 프로세스의 컨텍스트에서 호출됩니다.
이것은 귀하의 질문의 두 번째 부분에 대한 답변이 될 것입니다 SIG_CHILD
.
또한 신호 처리기가 사용자 공간에서 실행되는 이유도 묻습니다. 이는 프로세스가 커널에 코드를 주입하는 것을 원하지 않기 때문입니다. 그렇게 한다면 그들은 시스템의 신이 될 것입니다.
신호 처리기는 어떤 프로세스에서 실행됩니까?
프로세스가 exec를 호출하고 로드된 코드에 signal_handler가 포함되어 있고 이 신호 핸들러가 실행되면 (로드된 다른 모든 코드와 마찬가지로) 이 프로세스에서 실행됩니다. 한 프로세스의 코드가 실수로 다른 프로세스에서 실행되는 경우는 없습니다.