맨위로가기

C 시그널 처리

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

C 시그널 처리는 C 표준 라이브러리에서 제공하는 기능으로, 프로그램이 예외적인 상황이나 외부적인 요청에 대응할 수 있도록 한다. `signal.h` 헤더 파일에 정의된 6개의 표준 시그널(`SIGABRT`, `SIGFPE`, `SIGILL`, `SIGINT`, `SIGSEGV`, `SIGTERM`)을 포함하여, 구현에 따라 추가적인 시그널도 정의될 수 있다. 시그널은 `raise()` 함수로 발생시키거나 `kill()` 함수로 특정 프로세스에 전송할 수 있으며, 시그널이 발생했을 때 실행될 함수인 시그널 처리기를 설정하여 처리할 수 있다. 시그널 처리기는 `signal()` 또는 `sigaction()` 함수를 통해 설정하며, `SIGKILL`과 `SIGSTOP` 시그널은 잡거나 무시할 수 없다.

더 읽어볼만한 페이지

  • C 표준 라이브러리 - 파일 끝
    파일 끝(EOF)은 데이터 소스에서 더 이상 읽을 데이터가 없음을 나타내는 조건이다.
  • C 표준 라이브러리 - C 자료형
    C 자료형은 C 언어에서 데이터 형태를 정의하는 기본 요소로, 다양한 크기와 속성을 가진 산술, 부울 자료형과 구조체, 공용체 등을 제공하며, 컴파일러 및 시스템 아키텍처에 따라 크기와 동작 방식이 달라질 수 있다.
C 시그널 처리
C 시그널 처리
유형C 표준 라이브러리
헤더시그널.h (signal.h)
도입ANSI C (C89)
함수
시그널signal
raise
설명C 언어에서 시그널을 처리하기 위한 함수들을 제공

2. 표준 시그널

C 표준에서는 `signal.h` 헤더 파일(`C++`에서는 `csignal`)에 정의된 6개의 표준 시그널을 제공한다.[4] 구현에 따라서는 `signal.h` 헤더에 추가적인 시그널이 정의될 수 있다. 예를 들어 유닉스 계열 운영 체제는 15개 이상의 추가적인 시그널들을 정의한다.[5]

2. 1. 종류

C 표준은 6개의 시그널만을 정의하며, 이들은 모두 `signal.h` 헤더 (`csignal` - C++에서)에 정의되어 있다.[4]

  • `SIGABRT` - "abort", 비정상적 종료.
  • `SIGFPE` - '''부동소수점'''.
  • `SIGILL` - "illegal", 유효하지 않은 명령어.
  • `SIGINT` - "interrupt", 프로그램에 보내진 상호적인 요청.
  • `SIGSEGV` - "세그멘테이션 오류", 유효하지 않은 메모리 접근.
  • `SIGTERM` - "terminate", 프로그램에 보내진 종료 요청.


유닉스 계열 운영 체제와 같이 구현에 따라서 `signal.h` 헤더에 추가적인 시그널들이 정의되어 있을 수 있다. 예를 들어 유닉스 계열 운영체제는 15개 이상의 추가적인 시그널들을 정의한다.[5]

2. 2. 추가 시그널

유닉스 계열 운영 체제(예: 리눅스)는 15개 이상의 추가적인 시그널을 정의한다.[5] 디버깅 목적으로 `SIGTRAP` 시그널을 사용할 수 있다. (플랫폼에 따라 다름)

3. 시그널 처리

시그널은 `raise()` 또는 `kill()` 시스템 호출을 통해 생성될 수 있다. `raise()`는 현재 프로세스에, `kill()`은 특정 프로세스에 시그널을 전송한다.[3]

SIGKILL과 SIGSTOP을 제외한 모든 시그널에 대해 사용자 정의 시그널 처리기(핸들러)를 설정할 수 있다. 시그널 처리기는 해당 시그널이 발생했을 때 호출되는 함수이다. 시그널 처리기는 프로그램 실행을 일시 중단시키고, 처리기가 반환되거나 `longjmp()`를 호출할 때까지 대기한다. 최대한의 호환성을 위해 비동기적 신호 처리기는 다음 작업만 수행해야 한다.


  • `signal()` 함수를 성공적으로 호출한다.
  • `sig_atomic_t` volatile 변수 타입 객체에 값을 할당한다.
  • 호출자에게 제어를 반환한다.


프로그램 내부 오류로 시그널이 발생한 경우, 시그널 처리기는 `abort()`, `exit()`, `longjmp()`를 호출하여 종료할 수 있다.

3. 1. 시그널 핸들러

시그널 핸들러는 특정 시그널이 발생했을 때 호출되는 함수이다.[3] 시그널 핸들러는 프로그램의 실행을 일시 중단시키고, 핸들러가 반환되거나 `longjmp()`를 호출할 때까지 대기한다.[3]

시그널 핸들러는 `signal()` 또는 `sigaction()` 함수를 사용하여 설정할 수 있다.[3] 다만, `signal()` 함수는 역사적으로 여러 번 변경되어 사용이 권장되지 않으며, 이식성을 위해서는 SIG_DFL 또는 SIG_IGN으로 시그널 처분을 설정하는 경우에만 사용해야 한다.[3] SIGKILL과 SIGSTOP 두 가지 시그널을 제외한 모든 시그널에 대해 핸들러를 지정할 수 있다. (이 두 시그널은 잡거나, 차단하거나, 무시할 수 없다.)[3]

프로그램 내부 오류로 인해 시그널이 발생한 경우, 시그널 핸들러는 `abort()`, `exit()`, `longjmp()` 함수를 호출하여 프로그램을 종료할 수 있다.[3]

4. 관련 함수

함수설명
raise시그널을 인위적으로 발생시킨다.
signal프로그램이 특정한 시그널을 받았을 때의 행위를 설정한다.
kill지정된 프로세스에 신호를 인위적으로 보낸다.


5. 사용 예시

c

#include

#include

#include

static void catch_function(int signo) {

puts("대화형 주의 신호가 잡혔습니다.");

}

int main(void) {

if (signal(SIGINT, catch_function) == SIG_ERR) {

fputs("신호 처리기를 설정하는 동안 오류가 발생했습니다.\n", stderr);

return EXIT_FAILURE;

}

puts("대화형 주의 신호를 발생시킵니다.");

if (raise(SIGINT) != 0) {

fputs("신호를 발생시키는 동안 오류가 발생했습니다.\n", stderr);

return EXIT_FAILURE;

}

puts("종료합니다.");

return EXIT_SUCCESS;

// 신호를 발생시킨 후 종료

}

```

```c

#include

#include

#include

volatile sig_atomic_t status = 0;

static void catch_function(int signo) {

status = signo;

}

int main(void) {

// 위의 함수를 SIGINT 신호의 신호 처리기로 설정합니다.

if (signal(SIGINT, catch_function) == SIG_ERR) {

fputs("신호 처리기를 설정하는 동안 오류가 발생했습니다.\n", stderr);

return EXIT_FAILURE;

}

puts("대화형 주의 신호를 발생시킵니다.");

if (raise(SIGINT)) {

fputs("신호를 발생시키는 동안 오류가 발생했습니다.\n", stderr);

return EXIT_FAILURE;

}

if (status == SIGINT) puts("대화형 주의 신호가 잡혔습니다.");

puts("종료합니다.");

return EXIT_SUCCESS;

// 신호를 발생시킨 후 종료

}

참조

[1] 서적 ISO/IEC 9899:1999 specification https://www.open-std[...]
[2] 웹사이트 The Open Group Base Specifications Issue 6 – signal.h – signals https://pubs.opengro[...] 2012-01-10
[3] 문서 Signal(2) manpage https://man7.org/lin[...]
[4] 서적 ISO/IEC 9899:1999 specification http://www.open-std.[...]
[5] 웹인용 The Open Group Base Specifications Issue 6 - signal.h - signals http://pubs.opengrou[...] 2012-01-10



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com