리눅스 시스템 프로그래밍 - 시그널

김신·2022년 12월 29일
0
post-thumbnail

0. 시그널

시그널은 비동기식 단방향 알림 메커니즘입니다. 커널에서 프로세스로, 프로세스에서 다른 프로세스로, 아니면 프로세스 자기 자신에게 시그널을 보낼 수 있습니다. 일반적으로 시그널은 세그멘테이션 폴트나 사용자가 Ctrl + C를 누르는 경우와 같이 프로세스에 특정 사건이 발생했음을 알려줍니다.

리눅스 커널에는 대략 30개 정도의 시그널이 있습니다. (정확한 숫자는 아키텍처마다 다릅니다.) 각 시그널은 상수와 이름으로 표현되는데, 예를 들어 x86-64에서 터미널이 끊겼을 때 시그널을 보내기 위해 사용되는 SIGHP은 1로 표현됩니다.

즉시 프로세스를 종료하도록 만드는 SIGKILL과 즉시 프로세스를 멈추게 만드는 SIGSTOP을 제외하고, 프로세스는 시그널을 받았을 때 어떻게 해야 할지 제어가 가능합니다. 프로세스를 종료하거나, 프로세스를 종료하고 메모리를 덤프하거나, 프로세스를 멈추거나, 아무 작업도 하지 않는 기본적인 동작을 그대로 따를 수도 있습니다. 그게 아니면 프로세스가 명시적으로 시그널을 무시하거나 독자적으로 처리하도록 해도 됩니다. 무시된 시그널은 조용히 버려집니다.

애플리케이션에서 시그널을 처리할 경우 사용자가 제공한 시그널 핸들러를 실행합니다. 프로그램은 시그널이 도착하자마자 바로 이 함수로 건너뛰며 시그널 핸들러가 반환될 때 프로그램 제어권은 인터럽트가 발생된 위치로 돌아옵니다.

1. 프로세스 간 통신

프로세스 사이에서 일어나는 정보 교환과 알림은 운영체제가 담당하는 가장 중요한 작업입니다. 리눅스 커널은 시스템 V와 POSIX에서 정의하고 표준화한 메커니즘은 물론이고 한두 가지 독자적인 메커니즘을 포함해서 과거부터 내려오는 유닉스 IPC 메커니즘 대부분을 구현합니다. 리눅스에서 지원하는 IPC 메커니즘은 파이프, 네임드 파이프, 세마포어, 메세지 큐, 공유 메모리, 퓨텍스가 있습니다.

2. 헤더 파일

리눅스 시스템 프로그래밍은 여러 헤더 파일을 중심으로 돌아갑니다. 커널 자체와 glibc는 시스템 프로그래밍에 사용되는 헤더 파일을 제공합니다. 이런 헤더는 표준 C(string.h) 계열과 일반적인 유닉스 계열(unistd.h)을 포함합니다.

0개의 댓글