시그널

hgh1472·2023년 12월 23일
0

signal

signal = software interrupt

kernel -> process or process -> process
자료 전송보다는 비정상적인 상황을 알릴 때 사용한다.

예시

program 수행 중 Ctrl-C (interrupt key)
-> kernel이 문자를 감지한다. 해당 session에 있는 모든 process에게 "SIGINT"라는 signal을 보낸다. 모든 process는 종료. 그러나, shell process는 무시한다.

signal의 기본 처리

  • 종료 (signal에 의한 정상 종료)
  • 코어 덤프 후 종료 (signal에 의한 비정상 종료)
  • 중지
  • 무시

child process의 종료 상태 확인

if (WIFEXITED(status)) // 정상종료
if (WIFSIGNALED(status)) // signal을 받고 종료

signal 보내기

사용법

#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
  • pid : signal을 받게 될 process 지정
  • sig : 보낼 signal 지정

signal을 받을 process 또는 process group 지정

  • pid > 0 : 해당 id의 process에게 signal 전달
  • pid = 0 : sender와 같은 process group에 속하는 모든 process 에게 signal 전달. (sender 자신 포함)
  • pid = -1 : uid가 sender의 euid와 같은 모든 process에게 signal 전달. (sender 자신 포함)
  • pid < 0 & pid != -1 : process의 group id가 pid의 절대값과 같은 모든 process에게 signal 전달

signal handling

  • signal Handling
    • default action (프로세스 종료)
    • 무시
    • 정의된 action

sigaction 지정

signal 수신 시 원하는 행동을 취할 수 있도록 한다.

지정 방법

#include <signal.h>
int sigaction(int signo, const struct sigaction *act, struct sigaction *oact);

sigaction의 구조

struct sigaction {
	void (*sa_handler) (int);
    sigset_t sa_mask;
    int sa_flags;
    void (*sa_sigaction) (int, siginfo_t &, void *);
}

void (*sa_hanlder) (int);

signo를 수신하면 취할 행동 지정한다.

  • SIG_DFL(default 행동, 즉 종료 선택)
  • SIG_IGN(무시)
  • 정의된 함수

한 process에서 무시되는 signal은 exec()후에도 계속 무시된다.

sigset_t sa_mask

여기 정의된 signal들은, sa_handler에 의해 지정된 함수가 수행되는 동안 blocking 된다.

int sa_flags

SA_RESETHAND : handler로부터 복귀 시 signal aaction을 SIG_DFL로 재설정
SA_SIGINFO : sa_handler 대신 sa_sigaction 사용

signal 집합 지정

signal 집합 지정

  1. sigemptyset -> sigaddset
  2. sigfillset -> sigdelset

예시

sigset_t mask1, mask2;

sigemptyset(&mask1);
sigaddset(&mask1, SIGINT);
sigaddset(&mask1, SIGQUIT);

sigfillset(&mask2);
sigdelset(&mask2, SIGCHLD);

alarm signal 설정

timer 사용

#include <signal.h>
unsigned int alarm(unsigned int secs);
  • sec : 초 단위의 시간, 시간 종료 후 SIGALRM을 보낸다.
  • alrm은 exec후에도 계속 작동, but fork 후 자식 프로세스에 대한 alarm은 작동하지 않는다.
  • alarm(0); -> alarm 끄기
  • alarm은 누적되지 않는다. 2번 사용되면, 두 번째 alarm이 대체

signal blocking

사용법

#include <signal.h>
int sigprocmask(int how, const sigset_t *eset, sigset_t *oset);
  • how := SIG_SETMASK : set에 있는 signal들을 봉쇄
  • oset은 봉쇄된 signal들의 현재 mask; 관심 없으면 NULL로 지정
  • how := SIG_UNBLOCK : 봉쇄 제거

pause 시스템 호출

사용법

#include <unistd.h>
int pause(void);

signal 도착까지 실행을 임시 중단한다.
signal이 포착되면, 처리 routine 실행 & -1 return

0개의 댓글