2012. 7. 13. 16:30

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
Posted by 몰라욧