[Linux] Signal 함수
Signal
Signal의 비동기적 신호처리
#include <signal.h>
void (*signal (int sig, void(*func)(int)))(int);
typedef void (*sig_t) (int);
sig_t signal(int sig,sig_t func);
인터럽트처리를 위한 함수.
sig : 제어하고자하는 signal 고유번호
function :
- signal 발생시 호출할 함수
- SIG_DFL : 신호에 대한 기존 방식
- SIG_IGN : 신호를 무시
return : 함수의 최근값. 기존의 동작방식
sigwait
Signal의 동기적 신호처리
#include <signal.h>
int sigwait(const sigset_t *restrict set, int *restrict sig);
typedef struct {
unsigned int _sigbits[4];
}
sigaction
sigaction은 signal을 객체단위로 제어
struct sigaction {
union __sigaction_u __sigaction_u; /* signal handler */
sigset_t sa_mask; /* signal mask to apply */
int sa_flags; /* see signal options below */
};
union __sigaction_u {
void (*__sa_handler)(int);
void (*__sa_sigaction)(int, siginfo_t *, void *);
};
#define sa_handler __sigaction_u.__sa_handler
#define sa_sigaction __sigaction_u.__sa_sigaction
int sigaction(int sig, const struct sigaction *restrict act, struct sigaction *restrict oact);
signal을 set으로 묶어서 관리. 다음과 같은 set관리를 위한 함수가 제공됨.
int sigsuspend(const sigset_t *mask);
signal set 선언.
sigset_t sigset_name;
sigemptyset
int sigemptyset(sigset_t *set);
set의 모든 signal을 삭제.
sigfillset
int sigfillset(sigset_t *set);
set의 모든 signal을 추가.
sigaddset
int sigaddset(sigset_t *set, int signo);
signum에 해당되는 signal을 set에 추가.
sigdelset
int sigdelset(sigset_t *set, int signo);
signum에 해당하는 signal을 set에서 삭제.
sigismember
int sigismember(sigset_t *set, int signum);
해당 set에 signal 유무 확인.
sigpending
int sigpending(sigset_t *set);
signal이 발생했지만 block되어 대기중인 signal을 확인할 수 있다.
그러한 signal이 존재한다면 함수호출시 set에 해당 signal을 저장하고 0을 반환한다.
sigprocmask
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
SIGKILL과 SIGSTOP을 제외한 signal들을 block 가능
< how > ; 3 options
SIG_BLOCK/SIG_UNBLOCK : block할 signal에 set에 저장된 signal을 추가/해제 함.
SIG_SETMASK : set에 저장된 signal들만 block함.
oldset에는 이전의 block된 signal이 저장된다.
kill
int kill(pid_t pid, int sig);
특정 프로세스 외에 그룹 id가 같은 프로세스들에게 signal을 전송할 수 있다.
pid | Description |
---|---|
양수 | 지정한 pid에 signal 전송 |
0 | 같은 그룹에 있는 프로세스들에 signal 전송 |
-1 | 권한을 갖고 있는 프로세스들에게 signal 전송 |
음수 | pid의 절댓값에 해당하는 프로세스 그룹에 signal 전송 |
ex)
#include <stdio.h>
#include <unistd.h>
int main(void)
{
printf("pid = %d\n", getpid());
while (1)
{
printf("tehyoyee\n");
sleep(1);
}
}
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
int main(int argc, char *argv[])
{
if (argc < 2)
printf("./a.out [프로세스 ID]\n");
else
kill(atoi(argv[1]), SIGKILL);
}
두번째 실행파일에 pid값을 인자로 넣어주면 첫번째 실행파일을 종료시킬 수 있다.
댓글남기기