sigwait() 전에 신호를 차단해야 하는 이유는 무엇입니까?

sigwait() 전에 신호를 차단해야 하는 이유는 무엇입니까?

APUE 12장, 454페이지에서는 다음과 같이 언급합니다.

잘못된 동작을 방지하려면 스레드가 기다리고 있는 신호를 차단해야 합니다.

표준에도 비슷한 내용이 있습니다.

신호는 다음과 같이 정의됩니다.놓다호출되면 차단했어야 했는데시그웨이트(); 그렇지 않으면 동작이 정의되지 않습니다.

이 텍스트에서는 어떤 버그/정의되지 않은 동작이 논의됩니까? 표준에서 근거나 응용 프로그램 사용법을 찾을 수 없으며 책의 설명을 이해하는 데 어려움을 겪고 있습니다.

신호가 차단되지 않으면... 호출이 완료되기 전에 신호가 스레드에 전달될 수 있는 타이밍 창이 열립니다 sigwait.

답변1

이것은에서 온 것입니다qnx 문서, 그러나 모든 Unix 및 Unix 계열 배포판과 관련이 있습니다.

sigwait()를 호출하기 전에 집합 정의 신호를 차단해야 합니다. 차단하지 않으면 호출이 이루어지기 전에 신호가 전달되어 호출이 차단될 수 있으므로 경쟁 조건이 발생하게 됩니다.

답변2

이 답변은 먼저 독자에게 표준 개발의 역사적 관점을 제시한 다음 요구 사항에 대한 이유를 설명하기 위해 표준의 특정 텍스트로 독자의 관심을 유도합니다.

XPG Issue 3에서는 POSIX.1-1988 표준과 일치하도록 , , 및 sigaction가 도입 되었습니다 . 이 중에서 신호 구성을 지정하기 위한 가장 포괄적이고 일관된 인터페이스를 제공 하고 신호에 대한 세분화된 응답 방법을 제공합니다.sig*setsigismembersigpendingsigprocmasksigsuspendsigactionsigpendingsigprocmasksigsuspend

XPG Issue 4(현재 가장 오래된 디지털 형식)에는 , sigaltstack, 가 도입되었습니다. 최신 표준은 그 출처가 어디인지 밝히지 않고 단일 스레드 프로세스 내에서만 작동하기 때문에 거의 쓸모가 없다고 말합니다.sig{hold,ignore,pause,relse,set}siginterruptsigaltstack

XPG Issue 5(Single Unix Spec Version 2)에서는 POSIX 실시간 및 스레딩 확장과의 일관성을 위해 , pthread_sigmask, sigqueue및가 도입되었습니다.sigtimedwaitsigwaitinfosigwait

이제 표준의 다른 두 부분을 살펴보는 것이 중요합니다.

시스템 인터페이스 일반 정보 볼륨, 신호 개념 1위:

...신호가 스레드로 전달되는 것을 "차단"할 수 있습니다. 차단 신호와 관련된 동작이 신호를 무시하지 않고 스레드에 대해 신호가 생성된 경우 신호는 호출에 의해 선택되고 반환될 때 차단 해제될 때까지 보류 상태로 유지되어야 합니다. 이 함수는 허용 sigwait()되거나 이와 관련된 작업은 이 신호를 무시하도록 설정됩니다.

sigwaitsigtimedwait분명히 신호를 무시하게 될 가능성 외에도 신호가 프로세스/스레드에 도달할 수 있는 두 가지 방법이 있습니다. 즉, 차단을 해제하거나 (및 및 그 형제 항목에 sigwaitinfo의해 승인되는 방식) 있습니다.

2위 sigaction:

프로세스 내의 동일한 신호에 대해 sigaction() 및 sigwait() 함수를 모두 사용한 결과는 지정되지 않습니다.

분명히 sigwait이것은 신호를 처리하는 두 번째 방법으로 생각되었습니다.

sigtimedwait이는 Fundamentals of Interfaces의 다음 텍스트를 통해 추가로 확인됩니다 sigwaitinfo.

sigwait 함수는 스레드가 비동기적으로 생성된 신호를 기다리는 동기화 메커니즘을 제공합니다.

관련 정보