sigpending() 블록화되도록 설정된 상태에서 발생한 시그널은 블록화되는데 이 블록화된 시그널을 얻어오는 함수
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
main()
{
sigset_t set, pend;
sigfillset(&set);
/* 모든 시그널에 블록 설정 */
sigprocmask(SIG_BLOCK, &set, NULL);
while(1) {
printf("Hello World\n");
sleep(2);
/* 블록 된 시그널 얻어 옴 */
sigpending(&pend);
/* SIGQUIT가 pend에 속해 있으면 종료 */
if(sigismember(&pend, SIGQUIT))
exit(0);
}
}
-----------------------------------------------------------------------------------------------------
sigint 를 볼록하하고 10초후에 26라인에서 sigint에 대한 블록을 해제하고 pause에 의해 임의의 시그널이
도착할 때 까지 실행을 중단시키는 프로그램
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void signalHandler(int signo);
main()
{
sigset_t set, oldset;
struct sigaction act;
act.sa_handler = signalHandler;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
/* SIGINT에 대해 act 행동을 하도록 설정 */
sigaction(SIGINT, &act, NULL);
sigemptyset(&set);
sigaddset(&set, SIGINT);
/* SIGINT 시그널에 블록 설정 */
sigprocmask(SIG_BLOCK, &set, &oldset);
sleep(10);
/* oldset의 시그널들이 블록화 된 시그널 집합으로 교체되는데
이 상황에서는 SIGINT 시그널에 대한 블록이 해제 */
sigprocmask(SIG_SETMASK, &oldset, NULL);
/* 시그널이 도착할 때까지 실행을 중단 */
pause();
exit(0);
}
void signalHandler(int signo)
{
printf("Hi! signal %d\n", signo);
}
------------------------------------------------------------------------------------------------------
앞의 프로그램은 두번의 sigint 시그널이 발생해야 프로세스가 종료되는 문제점이 있다.
sigint를 해제함과 동시에 시그널을 기다리는 동작을 하나로
sigsuspend()함수
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void signalHandler(int signo);
main()
{
sigset_t set, oldset;
struct sigaction act;
act.sa_handler = signalHandler;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
/* SIGINT에 대해 act 행동을 하도록 설정 */
sigaction(SIGINT, &act, NULL);
sigemptyset(&set);
sigaddset(&set, SIGINT);
/* SIGINT 시그널에 블록 설정 */
sigprocmask(SIG_BLOCK, &set, &oldset);
sleep(10);
/* 시그널 블록을 oldset로 설정함과 동시에 시그널이 도착할 때까지 중단 */
sigsuspend(&oldset);
exit(0);
}
void signalHandler(int signo)
{
printf("Hi! signal %d\n", signo);
}
'EMBEDDED > SYSTEM Proc' 카테고리의 다른 글
[Network] fcntl(), lockf() 예제 2 (0) | 2012.07.13 |
---|---|
[Network] fcntl(), lockf() 예제 (0) | 2012.07.13 |
[Signal] sigprocmask() 관련 예제 (0) | 2012.07.13 |
[Signal] raise(), alarm()관련 예제 (0) | 2012.07.13 |
[Signal] pause() 함수 예제 (0) | 2012.07.13 |