저는 두 프로세스 사이에 신호를 보내는 학교 과제를 진행하고 있습니다. 프로세스 1은 프로세스 2에 신호를 보내고, 프로세스 2는 SIGUSR1을 다시 프로세스 1로 보내 원래 신호를 확인합니다.
프로세스 2에서는 일반적 sigsuspend
으로 SIGUSR1을 기다리지만 SIGUSR1에 대한 핸들러를 설정하지 않으면 함수가 무기한 차단된다는 사실을 발견했습니다. 가상 핸들러를 구성한 후에는 sigsuspension이 제대로 작동했습니다.
계속하기 전에 대기 메커니즘으로 신호를 사용하는 경우 왜 가상 nandler를 정의해야 합니까?
답변1
POSIX 표준에서는sigsuspend
mask
신호 처리기가 입력되지 않은 신호를 포착한 경우 에만 반환하도록 간단히 정의했습니다 .
sigsuspens() 함수는 호출 스레드의 현재 신호 마스크를 sigmask가 가리키는 신호 세트로 대체한 다음 신호가 전달될 때까지 스레드를 일시 중지해야 하며, 이 작업은 신호 포착 함수를 실행하거나 프로세스를 종료하는 것입니다. […]
작업이 프로세스를 종료하는 것이라면 sigsuspens()는 절대 반환하지 않습니다. 작업이 신호 포착 함수를 실행하는 것이라면, sigsuspens()는 신호 포착 함수가 반환된 후에 반환되어야 하며 sigsuspens() 호출 이전에 존재했던 집합으로 신호 마스크를 복원해야 합니다.
sigsuspend
신호는 일반적인 신호 처리를 통해서도 처리됩니다.
- 무시된 신호는 프로세스를 정상적으로 중단하지 않으므로
sigsuspend
반환이 발생하지 않습니다. - 종료 신호는 프로세스를 종료하여
sigsuspend
돌아올 수 없도록 합니다. - 핸들러가 있는 신호는 핸들러를 실행한 다음 프로그램 실행을 재개하므로
sigsuspend
핸들러가 완료된 후 반환될 수 있습니다.
일반적으로(적어도 Linux, FreeBSD 및 Mac OS X에서는) SIGUSR1
프로세스가 종료되어야 하므로 프로세스 2는 무기한 차단보다는 종료되어야 합니다. 혹시 signal(SIGUSR1, SIG_IGN)
어딘가에서 사용해 본 적 있으신가요?