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

sigwaitinfo(2)

1장. sigwaitinfo(2)

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

대기열의 시그널(:12)을 동기적으로 기다린다.


1.1절. 사용법

#include <signal.h>

int sigwaitinfo(const sigset_t *set, siginfo_t *info);
int sigtimedwait(const  sigset_t  *set,  siginfo_t  *info,
                 const struct timespec timeout);
		


1.2절. 설명

sigwaitinfo()는 시그널 셋set에 설정된 시그널중 하나가 전달될 때까지 대기한다. 설정된 시그널 중 하나가 전달되면 즉시 리턴한다. 만약 info가 NULL이 아니라면 시그널 관련 정보를 채워준다.

sigtimedwait()는 timeout만큼 신호를 기다리다가 신호가 없을 경우 리턴한다는 걸 제외하고는 sigwaitinfo()와 동일하다.

struct timespec 
{
    long    tv_sec;         /* seconds */
    long    tv_nsec;        /* nanoseconds */
}
		

다음은 info구조체에 정의된 멤버 변수들이다.

typedef struct siginfo {
   int si_signo;     /* Signal number */
   int si_errno;     /* Error code */
   int si_code;                                                    
   pid_t si_pid;
   uid_t si_uid;
   void *si_addr;
   union sigval si_value;
   union {                                                        
      /* Skipping other fields */
      struct {
         int _band;  /* Socket event flags (similar to poll) */   
         int _fd;    /* Socket fd where event occurred */          
      } _sigpoll;                                      
   } _sifields;                                        
}  siginfo_t;                                        
                                                          
#define si_fd     _sifields._sigpoll._fd                  
		


1.3절. 반환값

성공할 경우 sigwaitinfo(), sigtimedwait()모두 시그널 번호를 리턴한다. 실패했을 경우 -1을 리턴한다.


1.4절. 에러

EAGIN

sigtimedwait()에서 timeout동안 아무런 신호가 전달되지 않았을 ㅕㅇ우

EINVAL

timeout가 잘못 설정되었다.

EINTR

시그널:::핸들러(:12)에 의해서 인터럽트가 걸렸다.


1.5절. 예제

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

int main()
{
    struct sigaction sigact;
    siginfo_t info;
    int signo;
    printf("My pid %d\n", getpid());
    sigemptyset(&sigact.sa_mask);
    sigaddset(&sigact.sa_mask, SIGUSR2);
    while(1)
    {
        signo = sigwaitinfo(&sigact.sa_mask, &info);
        printf("%d : %d\n", signo, info.si_pid);
    }
}
		
위 프로그램은 SIGUSR2가 전달되는걸 기다린다. 만약 SIGUSR2 시그널을 받는다면 시그널을 전달한 프로세스(:12)의 PID(:12)를 출력한다.

아래 프로그램은 위의 예제를 테스트 하기 위한 프로그램이다. 인자로 SIGUSR2 시그널을 받을 PID를 지정한다. 시그널을 받은 프로그램 측에서 시그널을 보낸 프로세스의 PID를 얻어오는지 확인해 보도록 하자.

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

int main(int argc, char **argv)
{
    int pid = atoi(argv[1]);
    printf("%d\n", getpid());
    while(1)
    {
        kill(pid, SIGUSR2);
        sleep(1);
        printf("OK SIG\n");
    }
}