2012. 7. 13. 16:28

#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);
    }
}


------------------------------------------------------------------------------------------------------
시그널을 처리하는 도안 블록화할 시그널을 14라인에서 모든 시그널로 설정하여 시그널을 처리하는 동안 즉

signalHandler 함수를 실행하는 동안 발생한 시그널은 블록화되고 함수 실행이 끝나면 블록이 해제되어 블록

화 되었던 시그널을 받게 된다.

#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(3);
    printf("end handler\n");
}

[localhost@local]#a.out
call sigaction
^C              --> signalHandler 함수 실행
start handler
^Z              --> 블록화 됨(sigstop 시그널을 보내지만 블록화됨)
end handler
                --> 블록화 되었던 ^Z(sigstop) 시그널 해제되어 프로세스 멈춤
[1]+ Stopped                       ./a.out



-------------------------------------------------------------------------------------------------------
위의 프로그램에세 SA_NOMASK옵션을 주어 시그널을 처리하는 중에 또 다른 시그널이 발생하면 블록화 하지 않고

시그널을 받는다.


#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 = SA_NOMASK;
    /* SIGINT에 대해 act 행동을 하도록 설정 */
    sigaction(SIGINT, &act, NULL);
    printf("call sigaction\n");
    while(1)
       sleep(5);
}

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

[localhost@local]#a.out
call sigaction
^C              --> signalHandler 함수 실행
start handler
^Z              --> 프로세스 멈춤

[1]+ Stopped                       ./a.out


-----------------------------------------------------------------------------------------------------
sigaction() 함수의 세 번째 인수를 이용하여 sigaction함수를 호출하기 전에 설정된 상황으로 되돌리는

프로그램

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

void signalHandler(int signo);
int signal_count=0;

main()
{
    struct sigaction new_act;
    struct sigaction old_act;

    new_act.sa_handler = signalHandler;
    /* new_act.sa_mask는 시그널을 처리하는 동안 블록시킬 시그널을 모아 놓은
      시그널 집합인데, 시그널 집합을 비웠으므로 모든 시그널은 블록되지 않음 */
    sigemptyset(&new_act.sa_mask);
    new_act.sa_flags = 0;
    /* SIGINT에 대해 new_act로 설정하는데, 호출하기 전 행동 정보가 old_act에 저장 */
    sigaction(SIGINT, &new_act, &old_act);

    while(1) {
       printf("waiting signal\n");
       sleep(1);
       if (signal_count == 3)
          /* SIGINT에 대해 old_act(예전 행동)로 설정 */
          sigaction(SIGINT, &old_act, NULL);
    }
}

void signalHandler(int signo)
{
    signal_count++;
    printf("Hi! signal %d\n", signal_count);
}

'EMBEDDED > SYSTEM Proc' 카테고리의 다른 글

[Signal] pause() 함수 예제  (0) 2012.07.13
[Signal] kill() 관련예제  (0) 2012.07.13
[Signal] signal(SIGINT, SIG_DEL) 에 관한예제  (0) 2012.07.13
[Signal] signal()에 관한 예제  (0) 2012.07.13
[Signal] sleep()에 관한 예제  (0) 2012.07.13
Posted by 몰라욧