sigaction - 해당되는 글 2건


#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void signalHandler(int signo);

main()
{
    struct sigaction act;

    /* 시그널이 오면 signalHandler를 실행하도록 설정 */
    act.sa_handler = signalHandler;
    /* 모든 시그널은 시그널을 처리하는 동안 블록되도록 설정 */
    sigfillset(&act.sa_mask);
    act.sa_flags = 0;
    /* SIGINT에 대해 act 행동을 하도록 설정 */
    sigaction(SIGINT, &act, NULL);
    printf("call sigaction\n");
    while(1)
       sleep(5);
}

void signalHandler(int signo)
{
    printf("start handler\n");
    sleep(10);
    printf("end handler\n");
}

      c 언어  |  2007. 9. 17. 10:43




struct sigaction {
   void (*sa_handler)(int);  /* 설정할 시그널 핸들러 */
   void (*sa_sigaction)(int, siginfo_t *, void *);  /*SA_SIGINFO옵션을 주면   void (*sa_handler)(int)대신 이함수가  실행된다.
                                                                                                                sa_handler 대신 사용될 시그널 핸들러 */
   sigset_t sa_mask;  /* 시그널을 처리하는 동안 블록시킬 시그널 집합 */
   int sa_flags;  /* 시그널 처리 관련 옵션들 */
   void (*sa_restorer)(void);  /* 사용되지 않음 */
};

>> sa_flags 멤버

SA_NOCLDSTOP
signum이 SIGCHLD일 경우, 자식 프로세스가 멈추었을 때 부모 프로세스로 SIGCHLD가 전달되지 않는다.
SA_ONESHOT 또는SA_RESETHAND
시그널을 받으면 설정된 행동을 취하고, 시스템 기본 설정인 SIG_DFL로 재설정 한다.예제 24_6처럼 이런 옵션으로 설정할수 있다.
SA_RESTART
시그널 처리에 의해 방해받은 시스템 호출은 시그널 처리가 끝나면 재시작 한다.
SA_NOMASK 또는SA_NODEFER
시그널을 처리하는 동안에 전달되는 시그널은 블록되지 않는다.
SA_SIGINFO
이 옵션을 설정하지 않으면 시그널 번호 만을 인수로 하는 sa_handler가 동작을 하는데 이 옵션을 설정하면 세 개를 인수로 하는 sa_sigaction이 동작한다. 세 개의 인수는 시그널 번호, 시그널이 만들어진 이유, 시그널을 받는 프로세스의 정보이다.
-----------------------------26-7---------------------------------------------------------------
#include <stdio.h>
#include <signal.h>
#include <unistd.h>

main()
{
    struct sigaction act;

    /* 시그널에 대해 어떤 동작을 할 건지를 설정하는 문장으로
      시그널을 무시하도록 하는 SIG_IGN을 설정 */
    act.sa_handler = SIG_IGN;
    /* act.sa_mask는 시그널을 처리하는 동안 블록시킬 시그널을 모아 놓은
      시그널 집합인데, 시그널 집합을 비웠으므로 모든 시그널은 블록되지 않음 */
    sigemptyset(&act.sa_mask);
    /* 옵션을 설정하지 않음 */
    act.sa_flags = 0;
    /* SIGINT에 대해 act 행동을 하도록 설정 */
    sigaction(SIGINT, &act, NULL);

    while(1) {
       printf("Hello World\n");
       sleep(1);
    }
}

      c 언어  |  2007. 9. 17. 10:38



sokoban's Blog is powered by Daum & Tattertools