나는 사용자 공간에서 나만의 신호 처리 메커니즘을 개발 중입니다. 커널 코드를 탐색하고 일부 C 코드를 실행할 때. 나는 깨달았다.
시나리오 1: 내 코드가 신호를 수신한 후 신호 처리기를 실행할 때 다른 유형의 새 신호가 발생한다고 가정하면(이 새 신호도 처리됨) 이미 실행된 신호 처리기를 저장하기 위해 새 신호 신호 처리기(SH2)가 호출됩니다. (SH1). SH2가 완료되면 SH1은 중단된 부분부터 실행을 재개합니다.
시나리오 2: SIGINT, SIGUSR2 및 SIGHUP 신호에 대해 4개의 핸들러를 등록했습니다. 그런 다음 이러한 모든 신호를 차단하고 터미널의 "kill" 명령을 사용하여 신호를 생성했습니다. 그런 다음 신호를 다시 잠금 해제했습니다. 내가 관찰한 것은 이러한 신호가 순서대로 전달되고 해당 핸들러가 순서대로 실행된다는 것입니다.
따라서 신호 처리기가 순차적으로 실행될 때와 계단식으로 실행될 때입니다.
커널 소스 코드를 탐색했습니다.
- 신호가 생성되면 보류 목록에 추가되고 TIF_SIGPENDING 플래그가 설정됩니다. 타이머 인터럽트가 예약되면 이 플래그가 확인되어(확실하지 않음) do_signal()이 실행되어 신호를 대기열에서 제외하고 TIF_SIGPENDING 플래그를 다시 계산합니다. 보류 목록에 더 많은 신호가 있으면 이 플래그가 다시 설정됩니다.
이제 스케줄러 타이머가 만료되면 새 신호 처리기가 호출되어(신호 처리기가 계단식으로 연결됨) 경우에 따라 신호 처리기가 어떻게 순차적으로 실행될 수 있습니까?