Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

<a href="/modules/moniwiki/wiki.php/manSearch?google=none&name=sigqueue">sigqueue</a>(2)

1장. sigqueue(2)

차례
1.1절. 사용법
1.2절. 설명
1.3절. 반환값
1.4절. 에러
1.5절. 예제

대기열 기반 시그널및 데이터 전송


1.1절. 사용법

#include <signal.h>

int sigqueue(pid_t pid, int sig, const union sigval value);
		


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;
};
		
만약 시그널과 함께 데이터를 전송 받기를 원한다면 sigaction(2)을 이용해서 SA_SIGINFO플레그를 설정하고 시그널핸들러의 두번째 인자를 siginfo_t로 설정하면 된다. 받는측 에서는 대기열 기반 시그널인지 확인을 위해서 siginfo_tsi_codeSI_QUEUE인지를 검사하면 된다.


1.4절. 에러

EINVAL

잘못된 시그널

EPERM

신호를 받을 프로세스에 대한 권한이 없다.

ESRCH

신호를 받을 프로세스의 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);
    }   
}
		
위 예제는 시그널을 받는 예제 프로그램으로 대기열 기반의 리얼타임:::시그널(:12)에 대응한다. 프로그램 작동방식과 예제에 대한 자세한 설명은 Real Time Signal - 1을 참고하기 바란다.