대기열의 시그널(:12)을 동기적으로 기다린다.
#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);
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
성공할 경우 sigwaitinfo(), sigtimedwait()모두 시그널 번호를 리턴한다. 실패했을 경우 -1을 리턴한다.
sigtimedwait()에서 timeout동안 아무런 신호가 전달되지 않았을 ㅕㅇ우
timeout가 잘못 설정되었다.
시그널:::핸들러(:12)에 의해서 인터럽트가 걸렸다.
#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"); } }
RTS 개요
Copyrights © - Joinc, All Rights Reserved. Inherited From - Yundream Rebranded By - Joonphil
1장. sigwaitinfo(2)
대기열의 시그널(:12)을 동기적으로 기다린다.
1.1절. 사용법
1.2절. 설명
sigwaitinfo()는 시그널 셋set에 설정된 시그널중 하나가 전달될 때까지 대기한다. 설정된 시그널 중 하나가 전달되면 즉시 리턴한다. 만약 info가 NULL이 아니라면 시그널 관련 정보를 채워준다.
sigtimedwait()는 timeout만큼 신호를 기다리다가 신호가 없을 경우 리턴한다는 걸 제외하고는 sigwaitinfo()와 동일하다.
다음은 info구조체에 정의된 멤버 변수들이다.
1.3절. 반환값
성공할 경우 sigwaitinfo(), sigtimedwait()모두 시그널 번호를 리턴한다. 실패했을 경우 -1을 리턴한다.
1.4절. 에러
sigtimedwait()에서 timeout동안 아무런 신호가 전달되지 않았을 ㅕㅇ우
timeout가 잘못 설정되었다.
시그널:::핸들러(:12)에 의해서 인터럽트가 걸렸다.
1.5절. 예제
아래 프로그램은 위의 예제를 테스트 하기 위한 프로그램이다. 인자로 SIGUSR2 시그널을 받을 PID를 지정한다. 시그널을 받은 프로그램 측에서 시그널을 보낸 프로세스의 PID를 얻어오는지 확인해 보도록 하자.
1.6절. 참고문헌
RTS 개요
Recent Posts
Archive Posts
Tags