리눅스 sigaction 예제

Posted on

sig에 대한 이전 작업이 signal()에 의해 설정된 경우 oact가 가리키는 구조에서 반환되는 필드의 값은 지정되지 않으며, 특히 oact-> sa_handler는 반드시 signal()에 전달된 동일한 값이 아닙니다. 그러나, 동일한 구조 또는 이의 사본에 대한 포인터가 행위 인수를 통해 시그액션()에 대한 후속 호출로 전달되는 경우, 신호의 처리는 신호() 에 대한 원래 호출이 반복된 것처럼 되어야 한다. 여기서 signo가 신호 잡기 함수에 대한 유일한 인수입니다. 이 경우 응용 프로그램은 sa_handler 멤버를 사용하여 신호 잡기 함수를 설명하고 응용 프로그램은 sa_sigaction 멤버를 수정하지 않아야 합니다. 동일한 신호의 프로세스 내에서 동시 시그액션()과 sigwait() 함수를 사용한 결과는 지정되지 않습니다. 여기서 두 개의 추가 인수가 신호 잡기 함수로 전달됩니다. 두 번째 인수는 신호가 생성된 이유를 설명하는 siginfo_t 형식의 개체를 가리킵니다. 세 번째 인수를 ucontext_t 형식의 개체에 대한 포인터로 캐스팅하여 신호가 전달될 때 중단된 수신 스레드의 컨텍스트를 참조할 수 있습니다. 이 경우 응용 프로그램은 sa_sigaction 멤버를 사용하여 신호 잡기 함수를 설명하고 응용 프로그램은 sa_handler 멤버를 수정하지 않습니다.

SA_NODEFER 플래그는 커널 1.3.9 및 최신 커널에서 동일한 이름의 SVr4 플래그와 호환됩니다. 이전 커널에서 Linux 구현은 우리가 설치하는 신호뿐만 아니라 모든 신호를 수신할 수 있었습니다(sa_mask 설정을 효과적으로 재정의). 특정 신호에 대해 작업이 설치되면 다른 작업이 명시적으로 요청될 때까지(다른 호출에 의해 sigaction()), [XSI]는 SA_RESETHAND 플래그가 처리기를 재설정하거나 exec 함수 중 하나가 호출될 때까지 설치됩니다. . sigaction() 함수를 사용하면 호출 프로세스가 특정 신호와 연관될 동작을 검사 및/또는 지정할 수 있습니다. 인수 sig는 신호를 지정합니다. 허용 가능한 값은 . sigaction()에 정의되어 현재 신호 처리기를 쿼리하기 위해 null second 인수로 호출할 수 있습니다. 또한 null 두 번째 및 세 번째 인수를 호출하여 지정된 신호가 현재 컴퓨터에 유효한지 여부를 확인하는 데 사용할 수 있습니다. SA_SIGINFO 플래그(아래 참조)가 시그액션 구조의 sa_flags 필드에서 지워지면 sa_handler 필드는 지정된 신호와 연관될 동작을 식별합니다.

[XSI | RTS] sa_SIGINFO 플래그가 sa_flags 필드에 설정되어 있고 구현이 실시간 신호 확장 옵션 또는 XSI 확장 옵션을 지원하는 경우 sa_sigaction 필드는 신호 catch 함수를 지정합니다. IEEE Std 1003.1-2001의 이 볼륨은 NULL 행위 인수를 제공하는 sigaction()에 대한 호출이 성공하도록 요구하며, 이는 잡히거나 무시할 수 없는 신호(즉, SIGKILL 또는 SIGSTOP)의 경우에도 성공합니다. 시스템 V 신호() 및 BSD 시그벡() 함수는 이러한 경우 [EINVAL]을 반환하며, 이러한 점에서 동작은 시그액션()에서 다릅니다. int sigaction(int signum, 구성 구조체 시그액션 *행동, 구조체 시그액션 *oldact); 일부 아키텍처에서 공용 구조는 sa_handler 와 sa_sigaction 모두에 할당하지 않습니다. 이제 내 질문은 어떤 사람들에게 분명 할 수 있습니다, 왜 내가 이것을 실행할 때 인쇄 된 디버그 라인을 볼 수 없었습니까? 사실, 아무것도 인쇄되지 않았습니다. 이 것을 이해하도록 도와주셔서 대단히 감사합니다. 나는 리눅스에서 그것을 실행해요, 프로그램에 이클립스를 사용. 다음 예제에서는 siginT 신호에 대 한 처리기를 설정 하는 sigaction())의 사용을 보여 줍니다.