42Seoul/Minishell

[Minishell] signal

  • -
728x90

minishell 허용함수 정리 편에서 대략적인 함수 정리를 해놓았지만 좀 더 자세히 알아보자.

 

signal(시그널)

여러가지 시그널 중 몇 가지만 알아보자.

  • 1. SIGHUP : 터미널과 연결이 끊겼을 때 발생. 기본적인 처리는 프로세스가 종료된다.
  • 2. SIGINT : 인터럽트가 발생했을때 발생. 기본적으로 프로세스가 종료된다.
  • 9. SIGKILL : 프로세스를 무조건 종료한다. 절대 무시할 수 없으며 제어할 수 없다.
  • 11. SIGSEGV : 프로세스가 잘못된 메모리를 참조했을 때 발생. 코어덤프를 남기고 종료된다.
  • 19. SIGSTOP : 프로세스를 중단시킨다. 종료된 상태가 아니며 제어할 수 없다.

 

프로세스가 시그널을 받게되면 시그널에 해당되는 기본 동작을 하거나 그 시그널을 무시하거나 사용자가 정의한 함수를 통해 동작 방식을 바꿀 수 있다.

 

signal의 성질

  • 비신뢰성
    • 시그널을 보내면 그 시그널이 제대로 도착했는지, 잘 전달되었는지 확인하지 않는다. 때문에 신뢰성이 낮다.
  • 대기하지 않음
    • 만약 시그널 처리 함수를 시그널을 처리하고 있는데 그 사이에 다시 시그널을 주게 되면 그 시그널은 무시된다.

 

signal 함수 예제

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

 

 

interrupt

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

void	interruptHandler(int signo)
{
	printf("this program will be exited in 3 seconds...\n");
    sleep(3);
    exit(0);
}

int		main(void)
{
	signal(SIGINT, interruptHandler);
    printf("input ctrl+c\n");
    while(1);
}

 

stop

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

void	interruptHandler(int signo)
{
	printf("this program will be exited in 3 seconds...\n");
    sleep(3);
    exit(0);
}

int		main(void)
{
	signal(SIGSTOP, interruptHandler);
    printf("input ctrl+z\n");
    while(1);
}

 

여기서 의문점은 종료와 중단의 차이는 무엇일까?

중단(ctrl + z)의 경우는 아직 프로세스가 살아있으므로 fg % 3 으로 다시 실행시킬 수 있다. 하지만 종료(ctrl + c)의 경우는 프로세스가 종료되었으므로 다시 실행시킬 수 없다.

728x90
300x250
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.