sigaction을 사용하여 프로세스 간 통신을위한 신호 처리 모드 설정

하나, sigaction 기능 소개

헤더 파일 : signal.h

인터페이스 프로토 타입 : int sigaction (int signum, const struct sigaction * act, struct sigaction * oldact);

기능 : 1. oldact를 통한 신호 처리 방법 쿼리 2. act를 통한 신호 처리 방법 설정.

매개 변수 설명 :

  • signum : 작동 할 신호 SIGKILL 및 SIGSTOP을 제외한 모든 신호를 지정할 수 있습니다.
  • act : 설정할 신호의 새로운 처리 방법입니다.
  • oldact : 신호의 원래 처리 방법을 가져옵니다.

반환 값 : 0은 성공, -1은 오류가 발생했음을 의미합니다.

둘째, 구조 구조체 시그 액션 설명

 struct sigaction 유형은 신호 처리를 설명하는 데 사용되며 다음과 같이 정의됩니다.
 struct sigaction
 {       void (* sa_handler) (int);       void (* sa_sigaction) (int, siginfo_t *, void *);       sigset_t sa_mask;       int sa_flags ;       void (* sa_restorer) (void);  };





구조 멤버 설명 :

sa_handler는 함수 포인터이며 그 의미는 신호 함수의 신호 처리 함수와 유사합니다.

sa_sigaction은 또 다른 신호 처리 기능으로, 세 개의 매개 변수가 있으며 신호에 대한 자세한 정보를 얻을 수 있습니다. sa_flags 멤버의 값에 SA_SIGINFO 플래그가 포함 된 경우 시스템은 sa_sigaction 함수를 신호 처리 함수로 사용하고, 그렇지 않으면 sa_handler를 신호 처리 함수로 사용합니다. 일부 시스템에서는 sa_handler 및 sa_sigaction 멤버가 공용체에 배치되므로 사용할 때 동시에 설정하지 마십시오.
sa_mask 멤버는 ​​신호 처리 기능을 실행하는 동안 마스킹해야하는 신호를 지정하는 데 사용됩니다. 특히 신호가 처리 될 때 프로세스의 신호 마스크에 자동으로 입력되므로이 신호는 동안 사용되지 않습니다. 신호 처리 기능의 실행이 다시 발생합니다.
sa_flags 멤버는 신호 처리 동작을 지정하는 데 사용되며 다음 값의 "비트 OR"조합이 될 수 있습니다.
     ◆ SA_RESTART : 신호에 의해 중단 된 시스템 호출을 자동으로 다시 시작합니다.
     ◆ SA_NOCLDSTOP : 상위 프로세스는 하위 프로세스가 일시 중지되거나 계속 실행될 때 SIGCHLD 신호를 수신하지 않습니다.
     ◆ SA_NOCLDWAIT : 부모 프로세스는 자식 프로세스가 종료 될 때 SIGCHLD 신호를받지 않으며,이 때 자식 프로세스는 종료해도 좀비 프로세스가되지 않습니다.
     ◆ SA_NODEFER : 신호의 차폐를 무효화합니다. 즉, 신호 처리 기능을 실행하는 동안 신호를 계속 보낼 수 있습니다.
     ◆ SA_RESETHAND : 신호 처리 후 기본 처리 모드로 재설정합니다.
     ◆ SA_SIGINFO : 신호 처리 기능으로 sa_handler 대신 sa_sigaction 멤버를 사용합니다.

 re_restorer 멤버는 사용되지 않는 데이터 필드이므로 사용하지 마십시오.

세, 간단한 밤

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

void sigHandler(int signum)
{
    if (signum == SIGUSR1)
    {
        printf("receive signal SIGUSR1.\n");
    }
    else if (signum == SIGUSR2)
    {
        printf("receive signal SIGUSR2.\n");
    }
    else
    {
        printf("receive signal %d.\n", signum);
    }
}

int main()
{
    struct sigaction sigact;
    sigact.sa_flags = 0;
    sigact.sa_handler = sigHandler;

    sigaction(SIGUSR1, &sigact, NULL);
    sigaction(SIGUSR2, &sigact, NULL);

    printf("Current process id is %d\n", getpid());

    while (1)
    {
        int n = 0;
        char buf[512];
        if ((n = read(STDIN_FILENO, buf, 511)) == -1)
        {
            if (errno == EINTR)   // nterrupted system call 
            {
                printf("read is interrupted by signal\n");
            }
        }
        else
        {
            buf[n] = '\0';
            printf("%d bytes read %s\n", n , buf);
        }
    }
    
    return 0;
}

결과 :

추천

출처blog.csdn.net/xunye_dream/article/details/109565874