소켓프로그래밍#8 : 시그널

kkado·2022년 6월 4일
1

이전에 좀비 프로세스에 대해 알아보았다
좀비들을 소멸시킬 수 있는 시그널에 대해 다룬다.

시그널

시그널(Signal) - 말 그대로 특정 상황에서 OS가 프로세스에게 보내는 일종의 신호, 메시지이다. 시그널에는 SIGINT SIGCHLD 등 여러 종류가 있다.

시그널 핸들링

#include <signal.h>

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

시그널 함수는 다음과 같이 호출한다. 예시를 보자.

signal(SIGCHLD, mychild);

SIGCHLD는 자식 프로세스가 종료되었을 때 발생하는 시그널이다. 이때 mychild 함수를 호출한다는 의미이다.

시그널이 발생하면 sleep로 블로킹 되어 있던 프로세스가 깨어난다.

alarm(2);
sleep(100);

이렇게 설정해 주면 2초 뒤에 SIGALRM 시그널이 울리고, sleep 된 지 2초만에 바로 깨어난다.

sigaction

#include <signal.h>

int sigaction(int signo, const struct sigaction * act, struct sigaction *oldact);

파라미터는 다음과 같다.

  • signo : 핸들링 할 시그널의 정보
  • act : signo로 전달된 시그널이 발생했을 때에 호출할 함수(시그널 핸들러)
  • oldact : 이전에 등록된 시그널 핸들러의 함수 포인터를 받는다. 필요 없다면 그냥 0.
struct sigaction {
	void (*sa_handler) (int);
	sigset_t sa_mask;
	int sa_flags;
}

sigaction 구조체 변수를 선언해서 시그널 등록 시 호출될 함수의 정보 등을 채워서 함수 호출 시 인자로 전달한다. sa_mask와 sa_flags는 시그널 관련의 추가 정보를 전달해 주는데, 좀비 프로세스의 소멸이 목적이라면 둘 다 0으로 초기화하면 된다.

act.sa_flags = 0;
sigemptyset(&act.sa_mask);

주로 다음과 같이 선언하여 사용한다.

profile
울면안돼 쫄면안돼 냉면됩니다

0개의 댓글