Artigos

Tire duas dúvidas com o especialista no assunto Dr. Daphnis Citti de Lauro

sigprocmask 예제

sigprocmask, sigblock 및 sigsetmask는 일반적으로 중단 없이 실행해야 하는 코드의 작은 섹션의 실행을 보호하는 데 사용됩니다. 이렇게 하려면 신호 차단 기능 중 하나를 사용하여 중요한 코드를 시작하기 전에 중단을 차단합니다. 그런 다음 중요한 작업이 완료되면 모든 신호가 차단되기 전에 적용된 마스크를 복원합니다. 예를 들어 다음 코드는 sigprocmask를 호출하여 차단된 신호로 식별된 추가 신호를 차단하고 이전 마스크를 oldMask에 저장합니다. 새 마스크는 현재 신호 마스크와 차단된신호로 식별되는 추가 신호의 결합입니다. 그런 다음 중요한 코드가 완료된 후 이전 마스크를 복원하기 위해 sigprocmask를 두 번째로 호출합니다. 예를 들어, 이 코드는 인터럽트 신호와 사용자 정의 신호 SIGASY1을 모두 차단합니다 : 여기에 sigprocmask 기능을 설명하는 예가 있습니다: 시그서스펜션 호출과 다른 함수 호출의 시퀀스 사이에는 한 가지 중요한 차이점이 있습니다. sigsuspend가 사용될 때 표시됨: sigprocmask에 대한 두 번째 호출은 처리기가 호출되기 전에 발생합니다. sigsuspend 및 sigpause는 차단된 모든 신호로 필요한 처리를 수행한 다음 프로그램이 다른 신호를 수신할 준비가 되면 차단해제된 일부 또는 모든 신호로 일시 중지할 수 있는 인터럽트 기반 프로그램에 유용합니다. 신호가 보류 중이면 해당 신호에 대한 처리기가 호출됩니다. 그렇지 않으면 프로그램이 새 신호가 수신될 때까지 기다립니다. 두 경우 모두 모든 신호를 차단한 이전 마스크는 처리기가 호출되기 전에 복원됩니다.

이렇게 하면 처리기를 실행하는 동안 신호가 발견되지 않도록 하여 모든 신호가 수신된 순서대로 한 번에 하나씩 처리되도록 보장합니다. 따라서 한 신호의 처리는 다른 신호에 의해 중단되지 않습니다. 한 번에 하나의 신호만 처리하는 프로그램은 실행 중 중단을 허용하는 프로그램보다 더 안정적이고 쓰기가 더 쉽습니다. 마스크 설정에서 시그파우스 설명의 예를 참조하여 이러한 함수를 사용하여 한 번에 하나의 신호를 처리하는 방법에 대한 설명을 참조하세요. 이 예제에서는 SAS/C에서 관리하는 신호만 차단하는 경우 대신 시그셋마스크와 시그블록을 사용할 수 있습니다. 시그블록과 시그셋마스크는 모두 이전 신호 마스크를 반환합니다. 예를 들어, 모든 신호를 차단하고 이전 마스크의 값을 이전 마스크에 저장하기 위해 다음과 같이 sigblock을 호출 할 수 있습니다 : 이외에 sigprocmask, sigblock 및 sigsetmask, 라이브러리는 sigsuspend 및 sigpause 기능을 제공합니다. 이러한 함수는 일시 중지 및 sigprocmask 함수의 동작을 결합합니다. 다음은 sigsuspend 호출의 예입니다: sigpending 함수를 사용하여 신호가 보류 중인지 여부를 확인할 수 있습니다. 보류 중인 신호는 발생한 차단된 신호이며 신호 동작이 여전히 보류 중입니다.

시그보류에 전달된 sigset_t 구조는 호출 프로세스에 대한 보류 중인 신호로 채워져 있습니다. 또한 sigismember 함수를 사용하여 이전 예제에서 설명한 대로 특정 신호가 보류 중인지 확인할 수도 있습니다. sigprocmask() 함수는 호출 프로세스에 대한 신호 마스크를 검사하거나 변경(또는 둘 다)하는 데 사용됩니다. 집합 값이 NULL이 아닌 경우 현재 차단된 집합을 변경하는 데 사용할 신호 집합을 가리킵니다. 집합이 변경되는 방식을 나타내는 방법의 값: pthread_sigmask() 함수는 프로세스의 스레드 수에 관계없이 호출 스레드의 신호 마스크를 검사하거나 변경(또는 둘 다)하는 데 사용됩니다.