APUE 12장, 454페이지에서는 다음과 같이 언급합니다.
잘못된 동작을 방지하려면 스레드가 기다리고 있는 신호를 차단해야 합니다.
표준에도 비슷한 내용이 있습니다.
신호는 다음과 같이 정의됩니다.놓다호출되면 차단했어야 했는데시그웨이트(); 그렇지 않으면 동작이 정의되지 않습니다.
이 텍스트에서는 어떤 버그/정의되지 않은 동작이 논의됩니까? 표준에서 근거나 응용 프로그램 사용법을 찾을 수 없으며 책의 설명을 이해하는 데 어려움을 겪고 있습니다.
신호가 차단되지 않으면... 호출이 완료되기 전에 신호가 스레드에 전달될 수 있는 타이밍 창이 열립니다
sigwait
.
답변1
이것은에서 온 것입니다qnx 문서, 그러나 모든 Unix 및 Unix 계열 배포판과 관련이 있습니다.
sigwait()를 호출하기 전에 집합 정의 신호를 차단해야 합니다. 차단하지 않으면 호출이 이루어지기 전에 신호가 전달되어 호출이 차단될 수 있으므로 경쟁 조건이 발생하게 됩니다.
답변2
이 답변은 먼저 독자에게 표준 개발의 역사적 관점을 제시한 다음 요구 사항에 대한 이유를 설명하기 위해 표준의 특정 텍스트로 독자의 관심을 유도합니다.
XPG Issue 3에서는 POSIX.1-1988 표준과 일치하도록 , , 및 sigaction
가 도입 되었습니다 . 이 중에서 신호 구성을 지정하기 위한 가장 포괄적이고 일관된 인터페이스를 제공 하고 신호에 대한 세분화된 응답 방법을 제공합니다.sig*set
sigismember
sigpending
sigprocmask
sigsuspend
sigaction
sigpending
sigprocmask
sigsuspend
XPG Issue 4(현재 가장 오래된 디지털 형식)에는 , sigaltstack
, 가 도입되었습니다. 최신 표준은 그 출처가 어디인지 밝히지 않고 단일 스레드 프로세스 내에서만 작동하기 때문에 거의 쓸모가 없다고 말합니다.sig{hold,ignore,pause,relse,set}
siginterrupt
sigaltstack
XPG Issue 5(Single Unix Spec Version 2)에서는 POSIX 실시간 및 스레딩 확장과의 일관성을 위해 , pthread_sigmask
, sigqueue
및가 도입되었습니다.sigtimedwait
sigwaitinfo
sigwait
이제 표준의 다른 두 부분을 살펴보는 것이 중요합니다.
시스템 인터페이스 일반 정보 볼륨, 신호 개념 1위:
...신호가 스레드로 전달되는 것을 "차단"할 수 있습니다. 차단 신호와 관련된 동작이 신호를 무시하지 않고 스레드에 대해 신호가 생성된 경우 신호는 호출에 의해 선택되고 반환될 때 차단 해제될 때까지 보류 상태로 유지되어야 합니다. 이 함수는 허용
sigwait()
되거나 이와 관련된 작업은 이 신호를 무시하도록 설정됩니다.
sigwait
sigtimedwait
분명히 신호를 무시하게 될 가능성 외에도 신호가 프로세스/스레드에 도달할 수 있는 두 가지 방법이 있습니다. 즉, 차단을 해제하거나 (및 및 그 형제 항목에 sigwaitinfo
의해 승인되는 방식) 있습니다.
2위 sigaction
:
프로세스 내의 동일한 신호에 대해 sigaction() 및 sigwait() 함수를 모두 사용한 결과는 지정되지 않습니다.
분명히 sigwait
이것은 신호를 처리하는 두 번째 방법으로 생각되었습니다.
sigtimedwait
이는 Fundamentals of Interfaces의 다음 텍스트를 통해 추가로 확인됩니다 sigwaitinfo
.
sigwait 함수는 스레드가 비동기적으로 생성된 신호를 기다리는 동기화 메커니즘을 제공합니다.