신호 프로세서 SIGUSR1 및 SIGUSR2를 설치하는 방법은 무엇입니까?

신호 프로세서 SIGUSR1 및 SIGUSR2를 설치하는 방법은 무엇입니까?

기본적으로 사용자 신호 SIGUSR1 및 SIGUSR2는 프로세스나 스레드를 종료합니다. 핸들러를 설정하려면 어떻게 해야 합니까? 이 주제에 대한 다양한 기사를 읽어보았지만 이 주제를 처음 접했기 때문에 필요에 따라 이전하는 것이 불가능했습니다.

요구 사항은 다음과 같습니다. 루프에서 일련의 명령을 실행하는 많은 생산자 스레드(pthread)가 있으며 각 반복이 끝날 때 주 소비자 스레드에서 신호(sigwait) SIGURS1을 기다리고 다음 스레드로만 이동합니다. 신호를 받은 후 반복합니다. 그러나 기본적으로 수행되므로 완료됩니다.

그것들. 여기서는 다음 반복으로 전환하기 위해 이러한 신호를 수신하면 프로세스가 완료됩니다.

답변1

신호 처리기를 설정하는 데 사용할 수 있는 API가 많이 있습니다. 그 중 하나의 예를 들어 보겠습니다.

#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

static void signal_handler(int signo)
{
#       define signal_message "Signal received\n"
        write(1, signal_message, strlen(signal_message));
#       undef signal_message
}

int main(void)
{
        struct sigaction new_handler = {
                .sa_handler = signal_handler,
        };

        if (sigaction(SIGUSR1, &new_handler, NULL) < 0) {
                perror("sigaction");
        }

        pause();

        return 0;
}

sigaction()함수는 새로운 신호 처리기를 설치하며 그 서명은 다음과 같습니다:

int sigaction(int signum,
              const struct sigaction *act,
              struct sigaction *oldact);

첫 번째 매개변수는 신호 번호입니다(예를 들어 SIGUSR1두 번째 매개변수는 핸들러 세부 정보가 있는 구조에 대한 포인터이고 struct sigaction세 번째 매개변수는 struct sigaction핸들러가 저장될 이전 값에 대한 포인터입니다. 세 번째 매개변수는 NULL다음과 같습니다. 이전 값은 신경 쓰지 마세요.

필드 중 하나 struct sigactionsa_handler신호 처리 기능에 대한 포인터입니다. 함수의 서명은 다음과 같아야 합니다.

void function_name(int signo);

이 함수는 void수신된 신호 번호를 매개변수로 반환하고 받아들입니다.

요약하자면, 예제에서는 신호 처리기를 설치 SIGUSR한 다음 를 호출하여 pause()신호가 수신될 때까지 실행을 중지합니다. 그런 다음 SIGUSR이 코드를 실행하는 프로세스에 신호를 전달 하면 Signal received표준 출력으로 인쇄됩니다.

관련 정보