#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 |