tioon's Devlog

시그널(Signal)이란? 본문

네트워크

시그널(Signal)이란?

tioon 2023. 4. 3. 21:02

 

 

시그널이란?

   -운영체제나 프로세스 간의 정보를 전달하는데 사용되는 중요한 비동기적 메세지입니다.예기치않은 상황이 발생했을 때 프로세스에게 알리는 역할을 하거나, 이벤트에 대한 알림을 받는 용도로 주로 사용됩니다. 시그널은 다양한 이벤트에 대한 알림을 전달받기 위해 사용되며,일반적으로 작은 크기의 데이터만 전달 할 수 있기에, 대량의 데이터를 주고받는거에는 적합하지 않습니다.
시그널을 통해 프로세스간 통신(interprocess communication)이 가능하게하고, 프로그램의 동시성(concurrency)을 제어할 수 있습니다.   또한, 시그널은 운영체제에 따라 동작이 달라질 수 있어, 주의해야합니다.

 

 

 

시그널 특징
  • 비동기성(Asynchrony)
    -시그널은 비동기적으로 발생하며, 프로세스의 상태에 관계없이 언제든지 전달될수 있습니다.
  • 중단성(Interruptibility)
    -시그널은 프로세스의 실행을 중단하고 특정 동작을 수행하도록 강제 할 수 있습니다.
  • 데이터 전송x
    -시그널은 이벤트를 알리는 용도로 쓰이며, 데이터를 추가적으로 넣는것은 불가능합니다.
  • 사용자 정의(user-defined)
    -시그널은 막거나 무시할 수 있으며, 또한 사용자 정의 시그널을 만들어 새로운 시그널을 만들 수 있습니다.

 

시그널 번호 매크로 이름 시그널 내용
1 SIGHUP 제어 터미널과의 연결이 끊어졌을때 발생하는 시그널
2 SIGINT 프로그램 강제종료(ctrl+c)
8 SIGFPE 부동소수점 연산 오류 시그널
9 SIGKILL 프로세스 강제종료
14 SIGALRM 설정한 타이머시간 만료
12 SIGUSR2 사용자 정의 시그널
17 SIGCHLD 자식 프로세스 종료시 발생하는 시그널
19 SIGSTOP 프로세스 일시중단 시그널
26 SIGXFSZ 파일 크기 제한 초과 시그널

시그널의 종류가 엄청 많지만 대략적으로 위에 표시된 시그널들이 있습니다.

 

 

 

 

시그널 작동 순서
  1. 시그널 발생
    -특정 이벤트(ex. 사용자 입력, 하드웨어 이벤트 등)에 의해 발생합니다.  그 이후 커널은 해당 이벤트에 맞는 시그널을 생성합니다. 이벤트는 프로세스 내부(internally)에서 발생할 수도있고, 외부(externally)에서 발생할 수 도 있습니다.
  2. 시그널 전달
    -생성한 시그널은 이벤트가 발생한 프로세스에게 전달이 됩니다.
  3. 시그널 처리
    -시그널을 처리하기 위해 시그널 핸들러를 호출하고, 시그널 핸들러를 통해 시그널을 처리합니다. 이때 프로세스가 시그널을 받았을때, 무시하거나 기본 시그널 액션(종료, 코어 덤프, 무시)을 하거나, 사용자정의 함수를 불러올 수 있습니다. 
    (이때, 사용자정의 함수로 핸들러를 설정했다면 일반 함수와 똑같이 스택에 저장되고 실행되는 식으로 실행됩니다.)

 

시그널pending이란?

- 시그널 펜딩은, 해당 시그널이 아직 처리되지않고 대기중인 상태를 의미합니다.
시그널 핸들러에서 다른 시그널을 처리하고 있을때, 해당 시그널이 들어오면 바로 처리할 수 없어 시그널을 블록 시키는 현상입니다. 그리고 다른 시그널을 실행하고 블록을 해제하고 해당 시그널을 처리합니다.

 

 

 

시그널 발생 원인
  • 내부 생성(Generate internally)
    -프로세스 내부에서 발생하는 이벤트로 인해 생성되는 시그널, 프로세스 자체에서 생성되므로,프로세스의 상태변화가 있을때 자동으로 발생합니다. (SIGFPE , SIGSEGV , SIGALRM , SIGCHLD 등....)
  • 외부 생성(Externally Generated Signal)
    -프로세스 외부에서 발생하는 이벤트로 인해 생성되는 시그널, 주로 운영체제, 타 프로세스, 하드웨어 등의 외부요소에 의해 생성되어, 프로세스에게 이벤트를 알리거나, 상호작용을 위해 사용됩니다. (SIGINT , SIGTERM , SIGUSR 등....)

 

 

시그널 함수

void signal(int signum, void handler);

-새로운 시그널 핸들러를 등록하거나 이전 시그널 핸들러를 반환하는 함수입니다. signum에 해당하는 시그널이 발생하면, handler에 등록된 핸들러 함수가 호출되는 함수입니다. signum에 해당하는 시그널을 받으면 handler의 함수로 가서 핸들러를 실행합니다. 하지만 signal은 운영체제에 따라 달라질 수 있어, 다양한 os에서 실행하려면 sigaction함수를 쓰셔야합니다.

  • signum : 처리할 시그널 번호를 나타내는 정수 (ex. SIGINT , SIGTERM......)
  • handler : 등록하려는 시그널 핸들러 signum의 시그널이 발생했을때 호출될 핸들러를 지정
    (SIG_IGN = 시그널 무시, SIG_DFL = 디폴트 액션 , 그외다른 사용자함수....)

 

 

pid_t waitpid ( pid_t pid , int *status , int options );

-자식 프로세스의 종료를 기다리는 함수입니다, 이 함수는 부모 프로세스가 자식 프로세스의 종료를 감지하고 처리할 수 있도록 도와줍니다.

  • pid : 감시할 자식프로세스의 PID를 지정합니다.
  • status : 자식 프로세스의 종료상태가 저장될 변수의 주소를 전달합니다. 자식 프로세스가 종료되었을때, 이변수를 통해 상태정보를 확인할 수 있습니다.
  • options : 함수의 동작을 제어하는 플래그입니다.
    (WNOHANG = 자식 프로세스가 종료되지않았을때 함수 즉시반환, 0 = 프로세스 종료때까지 대기)

 

 

 

int sigaction(int signum , const struct sigaction *restrict act , struct sigaction *restrict oldact);

-signal()함수와 같은 기능을 하지만 더 많은 제어를 제공하며, 시그널 처리에 대한 더 많은 정보를 제공합니다.

  • signum : 처리할 시그널 번호를 나타내는 정수
  • act - 등록하려는 시그널 핸들러, 처리옵션 (구조체로 되어있어 많은정보를 가지고있음)
  • oldact - 이전에 등록된 시그널 처리정보를 저장하기 위한 변수 (이전의 핸들러 등록)

 

int kill ( pid_t pid , int sig );

-프로세스나 프로세스 그룹에게 시그널을 보내는 함수 (종료하는 함수가 아님)

  • pid > 0 :  해당 pid값과 일치하는 프로세스에게 시그널 전송.
  • pid = 0 : 시그널을 보내는 프로세스의 동일한 그룹 프로세스 들에게 시그널 전송.
  • pid = -1 : 시그널을 보내는 프로세스가 접근할 수 있는 모든 프로세스에 전송.
  • pid < -1 : pid의 절대값과 일치하는 프로세스 그룹의 모든 프로세스에게 전송.
  • sig = 0 : 아무에게도 보내지않음.

 

struct sigaction {

   void   (*sa_handler)(int);

   void   (*sa_sigaction)(int, siginfo_t *, void *);

   sigset_t    sa_mask;

   int    sa_flags;

   void   (*sa_restorer)(void);

};

   -시그널 구조체입니다. 이 구조체를 사용하여 시그널의 더 많은 정보를 전달 할 수 있습니다.

 

(sa_handler = 시그널 핸들러 함수 지정 , sa_sigaction = 시그널 핸들러 함수지정(3개의 인수 사용) , sa_mask = 차단할 시그널 집합 지정 , sa_flags = 시그널 처리,시그널 핸들러 방식제어 플래그 , sa_restorer = 시그널 핸들러 복원 루틴 지정)

 

 

 

 

 

'네트워크' 카테고리의 다른 글

MAC주소와 ARP  (0) 2023.05.02
멀티플렉싱 개념(select,epoll)  (0) 2023.05.02
멀티 쓰레드(세마포어,뮤텍스) , 멀티플렉싱이란?  (0) 2023.04.11
UDP 통신이란?  (0) 2023.03.27
TCP 통신이란?  (0) 2023.03.27