Blog

Signal 본문

Language/C

Signal

JunginKim 2022. 12. 5. 20:08
728x90
반응형

Signal

  • 예기치 않은 사건 발생 시 이를 알리는 SW Interrupt
    • SIGFPE: 부동소수점 오류
    • SIGPWR: 정전
    • SIGALARM: 알람시계 울림
    • SIGCHLD: 자식프로세스 종료
    • SIGINT: 키보드로부터 종료 요청(Ctrl + C)
    • SIGSTP: 키보드로부터 정지 요청(Ctrl + Z)

Create Signal

  • Terminal
    • Ctrl + C: SIGINT
    • Ctrl + Z: SIGSTP
  • Hardware Exception
    • 0으로 나누기: SIGFPE
    • 유효하지 않은 Memory 참조: SEGSEGV
  • kill() System Call
    • Process(Group)에 Signal 보내는 System Call
    • Process의 Owner거나 Superuser여야 함
  • Software Term
    • 알람: SIGALRM
    • 끊어진 PIPE: SIGPIPE
    • Child Process가 끝났을 때 Parent Process에게 전달되는 Signal: SIGCHLD

Main Signal

NameMeanDefault Processing
SIGABRTabort()에서 발생되는 종료 Signal종료(코어 덤프)
SIGALRMalarm() 울림 때 발생하는 알람 Signal종료
SIGCHLDProcess의 종료 혹은 중지를 Parent에게 알리는 Signal무시
SIGCONT중지된 Process를 계속시키는 Signal무시
SIGFPE0으로 나누기와 같은 심각한 산술 오류종료(코어 덤프)
SIGHUP연결 끊김종료
SIGILL잘못된 HW Command 수행종료(코어 덤프)
SIGIO비동기와 I/O Event 알림종료
SIGINTTerminal에서 Ctrl + C할 때 발생하는 Interrupt Signal종료
SIGKILL잡을 수 없는 Process를 종료시키는 Signal종료
SIGPIPEPIPE에 Write 할 때 Reader가 없을 때종료
SIGPIPEPIPE가 끊어졌을 때종료
SIGPWRPower 고장종료
SIGSEGV유효하지 않은 Memory 종료종료(코어 덤프)
SIGSTOPProcess 중지 Signal중지
SIGSTPTerminal에서 Ctrl + Z할 때 발생하는 중지 Signal중지
SIGSYS유효하지 않은 System Call종료(코어 덤프)
SIGTERM잡을 수 있는 Process 종료 Signal종료
SIGTTIN후면 Process가 Control Terminal에 Read중지
SIGTTOU후면 Process가 Control Terminal에 Write중지
SIGUSR1사용자 정의 Signal종료
SIGUSR2사용자 정의 Signal종료

Signal Processing

  • 기본 처리 동작
  1. Process Terminate(종료)
  1. Signal Ignore(무시)
  1. Process Suspend(중지)
  1. Process Resume(계속)

alarm()

#include <unistd.h>
unsigned int alarm(unsigned int sec)
// sec초 이후 Process에 SIGALRM Signal 발생
  • 한 Process 당 하나의 alarm() 가능
    • 이전에 설정된 alarm()이 있다면 취소되고 남은 초를 return
    • 이전에 설정된 알람이 없다면 0 return
  • alarm(0): 이전에 설정한 alarm() 취소

Signal Handling

signal()

#include <signal.h>
signal(int signo, void (*func))
// signo에 대한 처리 function을 func로 지정 후 기존 처리 function return
  • signal() System Call: 이 Signal이 발생하면 이 function으로 처리
  • Signal 처리 Function func
    1. SIG_IGN: Signal Ignore
    1. SIG_DFL: Defualt 처리
    1. 사용자 정의 함수 이름
  • pause(): Signal을 받을 때까지 해당 Process Sleep

sigaction()

  • signal()보다 정교하게 Signal 처리기를 등록하기 위한 function
#include <signal.h>
int sigaction(int sgnum, const struct sigaction *act, struct sigaction *oldact);
// signum Signal(SIGKILL, SIGSTOP 제외) 수신 시 Process가 취할 Action 변경에 사용

struct sigaction {
	void (*sa_handler)(int); // Signal 처리기
	void (*sa_sigaction)(int, siginfo_t *, void *);
	sigset_t sa_mask; // Signal 처리하는 동안 차단할 Signal 집합
	int sa_flags;
};
#include <stdio.h>
#include <signal.h>
struct sigaction newact;
struct sigaction oldact;
void sigint_handler(int signo) {
	printf("No. %d Signal Handling\n", signo);
	printf("If you press again, it will be Suspend");
	sigaction(SIGINT, &oldact, NULL); // 기존 처리 Action으로 변경
}
int main() {
	newact.sa_handler = signint_handler; // Signal Handler 지정
	sigfillset(&newact.sa_mask); // 모든 Signal 차단하도록 Mask
	sigaction(SIGINT, &newact, &oldact); // SIGINT의 처리 Action을 새로 지정, Old에 Backup
	while(1) {
		printf("Press Ctrl+C\n");
		sleep(1);
	}
	return 0;
}

Send Signal

kill()

  • Kill Command
    • 다른 Process를 Control 하기 위해 특정 Process에 임의의 Signal을 강제적으로 전송
  • kill() System Call
    • 특정 Process pid에 원하는 임의의 Signal signo를 전송
    • 보내는 Process의 Owner가 Process pid의 Owner와 같거나 SuperUser여야 함
#include <sys/types.h>
#include <signal.h>

int kill(int pid, int signo);
// Process pid에 Signal signo를 보냄 성공 시 0, 실패 시 -1 return
  • pid > 0: Process ID가 pid인 Process에 신호
  • pid == 0: 보내는 Process의 Process Group ID와 동일한 Group ID를 가진 Process들에게 신호
  • pid < 0: Process Group ID가 -pid인 Process들에게 신호

Signal을 이용한 Process Control

  • SIGCONT: Process 재개
  • SIGSTOP: Process 중지
  • SIGKILL: Process 종료
  • SIGTSTP: Ctrl + Z에서 발생
  • SIGCHLD: Child Process 중지 or 종료 시 Parent Process에게 전달

Uploaded by N2T

728x90
반응형

'Language > C' 카테고리의 다른 글

CMake  (2) 2022.12.28
Makefile  (0) 2022.12.05
Comments