유닉스 커널의 신호 처리

유닉스 커널의 신호 처리

The Design Of UNIX OS를 읽고 있는데 질문이 있습니다.

신호 처리 함수는 signal() 호출에서 지정할 수 있습니다. 핸들러는 프로세스가 특정 신호를 수신할 때 실행되어야 합니다. 프로세스가 신호를 받으면 psig라는 알고리즘이 실행되어 신호를 처리합니다.

사용자 정의 핸들러가 지정된 경우 psig 알고리즘은 사용자 수준 컨텍스트를 수정합니다(즉, 스택 포인터가 스택 상단을 가리키는 상태에서 프레임을 스택 상단으로 푸시합니다). 이 프레임은 핸들러 기능의 실행을 나타냅니다.

위의 내용이 true인 경우 신호 처리 함수는 항상 signal() 호출이 반환된 후에 실행되어야 합니다(커널은 스택 상단의 스택 프레임을 먼저 확인하기 때문입니다). 그러나 이는 코드 초기에(예를 들어 main()에서) 특정 신호에 대한 신호 처리기를 지정하고 코드의 후반부에 신호를 보낼 수 있기 때문에 그렇지 않습니다. 신호 처리 함수는 signal() 호출 직후가 아니라 신호가 전송될 때만 실행됩니다(예: kill() 호출을 통해).

누군가 이것을 명확히 할 수 있습니까?

답변1

나는 "유닉스 운영 체제의 설계"가 실제로는 모리스 J. 바흐(Maurice J. Bach)의 "유닉스 운영 체제의 설계"를 의미한다고 생각합니다.

귀하가 직면한 내용에 대한 최선의 추측은 203~204페이지에 걸쳐 있는 섹션 7.2.1입니다. 그는 신호 처리기를 설정하는 방법을 설명하는 두 문단으로 시작한 다음, 프로그램이 포착하도록 요청하는 신호를 수신할 때 커널이 수행하는 작업을 설명하는 세 번째 문단으로 시작합니다.

한 문단이 다른 문단 뒤에 이어진다는 사실이 거기에 설명된 일들이 시간상 바로 다음에 일어났다는 것을 말해주지는 않습니다. 산문집은 컴퓨터 알고리즘이 아니다. 바흐는 그 사이에 무슨 일이 일어났는지 명시적으로 말하지 않고 두 개의 개별 사건만 설명합니다.

따라서 대답은 '아니요'입니다. 호출이 완료된 psig()후 즉시 실행되지 않습니다 signal(2). 바흐는 그렇게 말하지 않았습니다. 당신은 방금 가정했습니다.

관련 정보