sigwaitinfo

OS/리눅스 & 유닉스 2012. 2. 21. 09:21

1장. sigwaitinfo(2)

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

대기열의 시그널을 동기적으로 기다린다.


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

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


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 시그널을 받는다면 시그널을 전달한 프로세스의 PID를 출력한다.

아래 프로그램은 위의 예제를 테스트 하기 위한 프로그램이다. 인자로 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");
    }
}
		

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

Using the "truss" command in Solaris  (0) 2012.03.16
Thread Functions for POSIX, Solaris and Windows NT  (0) 2012.03.14
pthread_kill  (0) 2012.02.16
grep 명령어  (0) 2012.02.13
grep, egrep, fgrep & 정규식  (0) 2012.02.13
: