보류 중인 상태에서 서로 다른 유형의 신호가 두 개 이상 있을 수 있습니다. 예를 들어 SIGINT 및 SIGTERM 신호는 보류 중일 수 있습니다 (즉, 아직 대상 프로세스로 전달되지 않음) 우리가 sigprocmask로 보았듯이 pthread_sigmask에는 신호 세트가 사용되는 방법을 정의하는 `방법`매개 변수가 포함되어 있습니다: pthread_sigmask() 기능은 sigprocmask(2)는 POSIX.1-2001에서 다중 스레드 프로그램에서 사용하는 것이 명시적으로 지정된다는 차이점과 함께 합니다. 다른 차이점은 이 페이지에 명시되어 있습니다. 섹션 10.12에서는 프로세스가 sigprocmask를 사용하여 신호전달을 차단하는 방법에 대해 논의했습니다. sigprocmask의 동작은 다중 스레드 프로세스에서 정의되지 않습니다. 스레드는 대신 pthread_sigmask를 사용해야 합니다. 올바른 코드는 집합을 모두 켜거나 모두 해제하도록 초기화합니다. 예를 들어 pthread_sigmask – 차단된 신호의 검사 및 변경 마스크 pthread_sigmask 기능은 스레드에서 작동하고 errno를 설정하고 -1을 반환하는 대신 오류 코드를 반환한다는 점을 제외하고는 sigprocmask와 동일합니다. 한 비트를 수정하기 전에 신호 집합을 초기화하는 것을 잊어 버리는 것은 일반적인 오류입니다. 예를 들어, [THR] pthread_sigmask() 함수는 [EINTR]의 오류 코드를 반환하지 않습니다. 동일한 신호를 sigwait 호출에서 여러 스레드가 차단된 경우 신호가 전달될 때 스레드 중 하나만 sigwait에서 반환됩니다. 신호가 잡히고 (프로세스는 예를 들어 sigaction를 사용하여 신호 처리기를 설정했습니다) 스레드가 sigwait 호출에서 동일한 신호를 기다리는 경우, 신호를 전달하는 방법을 결정하는 구현에 맡겨야 합니다. 이 경우 구현에서는 sigwait가 신호 처리기를 반환하거나 호출하도록 허용할 수 있지만 둘 다 호출하지는 않습니다.

[THR] pthread_sigmask() 및 sigprocmask() 함수는 실패합니다: [THR] pthread_sigmask() 함수는 프로세스의 스레드 수에 관계없이 호출 스레드의 신호 마스크를 검사하거나 변경(또는 둘 다)해야 합니다. 함수는 단일 스레드 프로세스에서 호출할 수 있는 제한 없이 sigprocmask()와 동일해야 합니다. 이 예제에서는 다중 스레드 프로세스에서 신호를 처리하기 위해 pthread_sigmask()를 사용하는 방법을 보여 주며 있습니다. 그것은 쉽게 적응 / 확장 할 수있는 상당히 일반적인 프레임 워크를 제공합니다. pthread_sigmask() 함수는 스레드 옵션의 일부로 표시됩니다. 예를 들어 SIGINT가 부모에서 차단되면 자식에서도 차단됩니다. 예를 들어 부모가 SIG-INT에 대한 처리기(콜백 함수)를 설치한 경우 자식도 동일한 동작을 수행합니다. 각 프로세스에 대해 각 신호에는 신호가 프로세스로 전달될 때 어떤 동작이 발생하는지를 의미하는 처리가 있습니다. 예를 들어, 기본 성향SIGINT는 종료하는 것입니다.

신호 처리는 signal() 호출(다른 POSIX 아키텍처에서 구현에 미묘한 차이가 있고 다중 스레드 프로그램에 는 권장되지 않음) 또는 시그액션(나중에 설명)을 호출하여 변경할 수 있습니다. . 가능한 모든 신호에 대한 프로세스의 처리가 함수 포인터 항목(가능한 각 신호에 대해 하나씩)의 테이블이라고 상상할 수 있습니다. 각 스레드에는 자체 신호 마스크가 있지만 신호 처리는 프로세스의 모든 스레드에서 공유됩니다.