유닉스 신호
유닉스 신호 (Unix signal)는 유닉스, 리눅스, POSIX 호환 운영체제에서 프로세스 간 통신에 사용되는 제한적인 형태의 메커니즘이다. 신호는 운영체제가 특정 이벤트 발생을 알리기 위해 프로세스에 보내는 메시지 역할을 한다. 이러한 이벤트는 하드웨어 오류, 사용자 인터럽트, 프로그래밍 오류, 또는 다른 프로세스의 요청 등 다양할 수 있다.
프로세스는 특정 신호를 받으면 미리 정의된 방식으로 반응하거나, 신호를 무시하거나, 또는 기본 동작(예: 프로세스 종료)을 수행할 수 있다. 각 신호는 일반적으로 특정 이벤트와 연관된 숫자로 식별되며, 인간이 읽기 쉬운 이름을 갖는다 (예: SIGINT
, SIGTERM
).
주요 특징:
- 비동기적 통신: 신호는 프로세스가 실행 중인 동안 언제든지 도착할 수 있다.
- 제한적인 정보 전달: 신호 자체는 작은 크기의 정보만 전달할 수 있다 (신호 번호). 추가적인 데이터 전달을 위해서는 다른 프로세스 간 통신 메커니즘 (예: 파이프, 소켓)이 필요하다.
- 신뢰성 문제: 모든 신호가 반드시 프로세스에 전달되는 것은 아니다. 일부 상황 (예: 신호가 너무 많이 발생)에서는 신호가 손실될 수 있다.
- 신호 처리기: 프로세스는 특정 신호에 대한 처리기를 등록하여, 해당 신호가 도착했을 때 실행될 사용자 정의 코드를 지정할 수 있다.
일반적인 유닉스 신호:
다음은 몇 가지 자주 사용되는 유닉스 신호의 예이다.
SIGINT
(인터럽트): 일반적으로 사용자가 Ctrl+C를 눌러 프로세스를 중단할 때 발생한다.SIGTERM
(종료): 프로세스를 정상적으로 종료하도록 요청하는 신호.SIGKILL
(강제 종료): 프로세스를 즉시 종료하는 신호. 프로세스는 이 신호를 무시할 수 없다.SIGHUP
(끊김): 터미널 연결이 끊어졌을 때 발생한다. 일반적으로 데몬 프로세스를 재시작하는 데 사용된다.SIGSEGV
(세그멘테이션 오류): 잘못된 메모리 접근이 발생했을 때 발생한다.SIGALRM
(알람):alarm()
함수를 사용하여 설정한 타이머가 만료되었을 때 발생한다.
사용 예시:
- 명령줄에서 실행 중인 프로그램을 중단하기 위해 Ctrl+C를 누르면 해당 프로세스에
SIGINT
신호가 전송된다. kill
명령어를 사용하여 특정 프로세스에SIGTERM
신호를 보내, 프로세스를 종료하도록 요청할 수 있다.- 프로세스는
signal()
또는sigaction()
함수를 사용하여 특정 신호에 대한 처리기를 등록하고, 신호가 발생했을 때 특정 작업을 수행하도록 설정할 수 있다.
유닉스 신호는 오래된 메커니즘이지만, 여전히 유닉스 및 리눅스 시스템에서 프로세스 관리에 중요한 역할을 수행한다.