ex)
1. SIGFPE : 부동소수점 오류
2. SIGPWR : 정전
3. SIGALARM : 알람시계 울림
4. SIGCHLD : 자식프로세스 종료
5. SIGINT : 키보드로부터 종료 요청 (Ctrl + C)
6. SIGSTP : 키보드로부터 정지 요청 (Ctrl + Z)
#include <unistd.h>
unsigned int alarm(unsigned int sec)
// sec초 후에 프로세스에 SIGALRM 시그널이 발생되도록 설정한다.
alarm(0) : 이전에 설정된 알람 취소
한 프로세스 당 오직 하나의 알람만 설정가능.
: 이전에 설정된 알람이 있으면 취소되고 남은 시간(초)를 반환
: 이전에 설정된 알람이 없으면 0 리턴
#include <signal.h>
signal(int signo, void (*func) )
signo에 대한 처리함수를 func로 지정하고 기존의 처리함수를 리턴
#include <signal.h>
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
// signum 시그널(SIGKILL과 SIGSTOP 제외)이 수신되었을 때, 프로세스가 취할 액션을 변경하는 데 사용된다. 이 시그널에 대한 새로운 액션은 act가 되며, 기존의 액션은 oldact에 저장된다. 성공하면 0을 실패하면 –1를 반환한다.
struct sigaction {
void (*sa_handler)(int); // 시그널 처리기
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask; // 시그널을 처리하는 동안 차단할 시그널 집합
int sa_flags;
};
ex) sigint2.c
#include <stdio.h>
#include <signal.h>
struct sigaction newact;
struct sigaction oldact;
void sigint_handler(int signo);
void sigint_handler(int signo)
{
printf("%d번 시그널 처리\n",signo);
printf("또 누르면 종료됩니다\n");
sigaction(SIGINT,&oldact,NULL); // 기존 처리 액션으로 변경
}
int main()
{
newact.sa_handler = sigint_handler; // 시그널 처리기 지정
sigfillset(&newact.sa_mask); // 모든 시그널을 차단하도록 마스크
// SIGINT의 처리 액션을 새로 지정, oldact에 기존 처리 액션을 저장
sigaction(SIGINT, &newact, &oldact);
while(1)
{
printf("CTRL + C를 눌러보세요 \n");
sleep(1);
}
}
kill 명령어
: 한 프로세스가 다른 프로세스를 제어하기 위해 특정 프로세스에 임의의 시그널을 강제적으로 보낸다.
kill() 시스템 호출
: 특정 프로세스 pid에 원하는 임의의 시그널 signo를 보낸다.
: 보내는 프로세스의 소유자가 프로세스 pid의 소유자와 같거나 혹은 보내는 프로세스의 소유자가 슈퍼유저이어야 한다.__
#include <sys/types.h>
#include <signal.h>
int kill(int pid, int signo);
// 프로세스 pid에 시그널 signo를 보낸다. 성공하면 0 실패하면 -1 리턴한다.