성공할경우 0을 실패했을경우에는 -1을 반환하며, 적당한 errno 값을
설정한다. kill(2)과 매우 비슷하게 작동하며, kill(2)과 마찬가지로
null 시그널(:12)을 이용해서 프로세스가 존재하는지 확인하기 위한
목적으로 사용할 수도 있다.
value를 이용해서 시그널과 함께 필요한 데이터를
함께 전송할수도 있다. value는 다음과 같은 타입을 가진다.
union sigval
{
int sival_int;
void *sival_ptr;
};
만약 시그널과 함께 데이터를 전송 받기를 원한다면 sigaction(2)을
이용해서 SA_SIGINFO플레그를 설정하고
시그널핸들러의 두번째 인자를 siginfo_t로
설정하면 된다. 받는측 에서는 대기열 기반 시그널인지 확인을
위해서 siginfo_t의 si_code
가 SI_QUEUE인지를 검사하면 된다.
1장. sigqueue(2)
대기열 기반 시그널및 데이터 전송
1.1절. 사용법
1.2절. 설명
sigqueue는 지정된 시그널번호 sig를 PID가 pid인 프로세스 에게 보낸다.
1.3절. 반환값
성공할경우 0을 실패했을경우에는 -1을 반환하며, 적당한 errno 값을 설정한다. kill(2)과 매우 비슷하게 작동하며, kill(2)과 마찬가지로 null 시그널(:12)을 이용해서 프로세스가 존재하는지 확인하기 위한 목적으로 사용할 수도 있다.
value를 이용해서 시그널과 함께 필요한 데이터를 함께 전송할수도 있다. value는 다음과 같은 타입을 가진다.
union sigval { int sival_int; void *sival_ptr; };1.4절. 에러
잘못된 시그널
신호를 받을 프로세스에 대한 권한이 없다.
신호를 받을 프로세스의 PID가 존재하지 않는다.
1.5절. 예제
#include <signal.h> #include <stdio.h> #include <unistd.h> /* * 시그널 핸들러 * si_code가 SI_QUEUE 인지를 확인한후 원하는 작업을 한다. * SI_QUEUE일 경우 RTS형식으로 전달된 시그널이며 * 그렇지 않을경우 표준 유닉스 시그널이다. */ void sighandler(int signo, siginfo_t *si) { if(si->si_code == SI_QUEUE) { printf("User RTS signal %d\n", si->si_pid); printf("Sig Number %d\n", si->si_signo); printf("User Data is %d\n", si->si_value.sival_int); // 시그널이 큐잉되는지 확인하기 위한 코드 getchar(); } else { // kill등을 이용해서 표준 유닉스 시그널을 보냈을 경우 // 실행되는 루틴 printf("Get none realtime signal %d\n", signo); } } int main() { struct sigaction sigact; printf("My pid %d\n", getpid()); /* * sa_flags를 SA_SIGINFO로 설정하고 * 시그널 핸들러를 등록한다. */ sigemptyset(&sigact.sa_mask); sigact.sa_flags = SA_SIGINFO; sigact.sa_restorer = NULL; sigact.sa_sigaction = sighandler; /* * RTS시그널에 대한 핸들러를 설치한다. */ if (sigaction(SIGRTMIN, &sigact, 0) == 1) { printf("signal error\n"); exit(0); } while(1) { sleep(1); } }Recent Posts
Archive Posts
Tags