하나, 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;
}
결과 :