sigwaitinfo
OS/리눅스 & 유닉스 2012. 2. 21. 09:211장. sigwaitinfo(2)
대기열의 시그널을 동기적으로 기다린다.
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.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 시그널을 받을 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 |