프로세스 사이의 통신 - 시그널

이동욱

2021/08/14

Categories: 네트워크

프로세스 사이의 통신


시그널


시그널의 종류

번호 매크로이름 설명
2 SIGINT 사용자가 발생시키는 인터럽트 (CTRL + C)
3 SIGQUIT 프로그램 종료와 코어 파일 작성
8 SIGFPE 부동소수점에러가 발생했을 때 발생하는 시스널
9 SIGKILL 즉각적인 프로그램 종료를 위해 사용
14 SIGALRM 지정된 타이머의 경과
15 SIGTERM 프로그램 종료를 위한 시그널 (kill 명령어의 DEFAULT 시그널)
17 SIGHLD 자식 프로세스의 종료 시에 발생하는 시그널
19 SIGSTOP 프로세스를 정지시키는 시그널

“만약 우리가 시그널로 정의 되어 있는 특정 사건의 발생 여부에 관심이 있고 그 사건이 발생할 때 마다 무언가를 하고 싶다면 어떻게 해야할까?”

void (*signal(int sig, void (*func) (int)))(int);

예제

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

int global_count = 10;

void sigint_handler(int sig) {
  if (sig == SIGINT) {
    printf("received SIGINT... %d lives left \n", global_count--);
  }

  if (global_count <= 0) {
    signal(SIGINT, SIG_DFL);
  }
}

int main(int argc, char *argv[]) {
  int i = 0;
  signal(SIGINT, sigint_handler); // 터미널 창에서 CTRL + C 입력을 받으면 운영체제에게 sigint_handler 함수를 호출해 달라는 요청을 하는 과정이다.
  while (1) {
    printf("%d: sleep and awake \n", ++i);
    sleep(5);
  }
  return 1;
}

SIGACTION 함수

int sigaction(int sig, const struct sigaction *act, struct sigaction * oldact);
  • sig : 시그널 dml 종류를 지칭하는 시그널 번호
  • act: 시그널 발생시 호출되는 시그널 핸들러의 포인터
  • oldact: 이전에 등록되었던 시그널 핸들러의 포인터
struct sigaction {
  void (*sa_handler)(int);
  sigset_t sa_mask;
  int sa_flags;
}

예제

#include <stdio.h>
#include <unistd.h>
#include <signal.h>

int main(int argc, char *argv[]) {
  int i = 5;
  struct sigaction new_action, old_action;

  new_action.sa_handler = SIG_IGN; // 핸들러로 SIG_IGN 등록
  sigemptyset(&new_action.sa_mask);
  new_action.sa_flags = 0;

  sigaction(SIGINT, &new_action, &old_action);

  while (1) {
    printf("%d: sleep and awake \n", i--);
    sleep(1);
    if (i == 0) break;
  }
  return 1;
}

시그널 발생

#include <sys/types.h>
#include <signal.h>

int kill (pid_t pid, int sig);

kill() 함수의 첫번째 인자의 PID는 음수또는 0을 입력 받을 수 있는데 의미는 다음과 같다.

  • 음수로 입력한 경우에는 pid의 절대값이 지칭하는 프로세스가 속해있는 프로세스 그룹 전체로 시그널이 전달된다.
  • 0을 입력받는 경우 kill 함수를 호출한 프로세스가 속해있는 프로세스 그룹 전체로 시그널이 전달된다.
  • -1을 입력 받는 경우 kill 함수를 호출한 프로세스가 시그널을 전송할 수 있는 권한을 가지고 있는 모든 프로세스에게 시그널이 전달된다.

참고 문헌


>> Home