|
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
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);
}
}
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void signalHandler(int signo);
main()
{
/* SIGINT 시그널 받으면 signalHandler 실행하도록 설정 */
signal(SIGINT, signalHandler);
while(1) {
printf("Hello World\n");
sleep(1);
}
}
void signalHandler(int signo)
{
//SIGINT 시그널을 받으면 이함수가 소출되고 SIGINT의 넘버를 받은 signo를 출력하고
printf("Hi! signal %d\n", signo); /* signo는 시그널 번호를 출력을 해준다 */
/* SIGINT 시그널 받으면 시스템에서 기본적으로 설정한 동작을 하도록 설정
SIG_DFL이 실행 그다음 부터는 월래 대로 키를 입력하는대로 먹는다*/
signal(SIGINT, SIG_DFL);
}
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
main()
{
int count=0;
/* SIGINT 시그널 받으면 무시하도록 설정 */
signal(SIGINT, SIG_IGN);
while (1) {
printf("Hello World\n");
sleep(1);
if (++count == 5) /* count가 5가 되면 */
/* SIGINT 시그널 받으면 시스템에서 기본적으로 설정한 동작을 하도록 설정 */
signal(SIGINT, SIG_DFL);
}
}
5초가 지날때까지 콘트롤 제트가 먹지 않는다
sokoban's Blog is powered by Daum & Tattertools