둘둘리둘둘리둘둘리둘둘리둘둘리둘
Signal 본문
@ 종류
@ Signal 특징
- SIGKILL, SIGSTOP은 어플리케이션에서 catch 불가능하다. (시스템 관리차원)
- 자식프로세스 생성시 signal정책도 상속된다
- 어플리케이션이 Signal을 처리중에 들어온 다른 Signal은 버려진다
@ Signal 전송
kill(2)
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
- pid > 0 : 해당 pid에 전송
- pid == 0 : 자신이 속한 모든 그룹 프로세스에 전송
- pid < -1 : pid가 속한 모든 그룹 프로세스에 전송
- pid == -1: init 프로세스를 제외한 모든 프로세스에 전송
@ Signal 핸들링
signal(2)
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
특정 Signal을 무시하고 싶을 경우 핸들링 함수 대신 SIG_IGN을 써도된다.
(SIG_IGN: 무시, SIG_DFL: 기본 동작)
ex)
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void SignHandler( int sign );
int main(){
signal(SIGINT, (void *)SignHandler );
//signal(SIGINT, SIG_IGN);
while(1);
return 0;
}
void SignHandler(int sign){
printf("input:%d\n",sign);
exit(0);
}
@ Signal 핸들링 2
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
set에 등록된 시그널의 볼럭 정책을 변경, 블록된 상태의 시그널은 handler가 끝나고 전달됨
-int how
SIG_BLOCK : set에 설정된 시그널을 기존 블록 set에 추가
SIG_UNBLOCK : set에 설정된 시그널을 기존 블록 set에서 제거
SIG_SETMASK : set의 시그널셋을 블록 set 정책으로 정함
int sigpending(sigset_t *set);
set의 시그널이 블록된 상태에서 들어온적 있는지 확인
int sigismember(sigset_t *set, int signum);
signum이 set에 포함되어있는지 확인
int sigsuspend(const sigset_t *mask);
호출한 프로세스의 시그널 마스크를 일시적으로 대체함
int sigfillset(sigset_t *set);
set의 모든 시그널을 on
int sigemptyset(sigset_t *set);
set의 모든 시그널을 off
int sigaddset(sigset_t *set, int signum);
signum을 set에 추가함
int sigdelset(sigset_t *set, int signum);
signum을 set에서 제거함
ref: http://www.joinc.co.kr/w/Site/system_programing/Book_LSP/ch06_Signal
'Linux > Programming' 카테고리의 다른 글
IPC(Inter Process Communication) (0) | 2016.07.09 |
---|---|
Thread (0) | 2016.07.08 |
유저 정보 획득 (0) | 2016.07.03 |
파일 속성 획득 (0) | 2016.07.03 |
man page 사용법 (0) | 2016.07.02 |