-
std::signal프로그래밍 언어/C++ 2024. 7. 16. 09:55
std::signal 함수는 C++ 표준 라이브러리에서 제공하는 함수로, 특정 신호(signal)가 발생했을 때 호출될 신호 처리기(signal handler)를 설정하는 데 사용됩니다. 이 함수는 C 라이브러리의 signal 함수와 동일한 기능
#include <csignal> void ( *signal (int sig, void(*func)(int)) )(int);
매개변수
- sig: 설정할 신호의 종류를 나타내는 정수 값입니다. 표준 신호로는 SIGINT, SIGTERM, SIGKILL, SIGSEGV 등이 있습니다.
- handler: 신호가 발생했을 때 호출될 함수의 포인터입니다. 이 함수는 정수형 매개변수를 하나 가지며, 해당 매개변수는 발생한 신호를 나타냅니다.
반환값
- 이전에 설정된 신호 처리기의 포인터를 반환합니다. 만약 이전에 설정된 신호 처리기가 없었다면, 기본 동작을 나타내는 SIG_DFL을 반환합니다.
#include <csignal> #include <atomic> #include <iostream> volatile std::sig_atomic_t signalReceived = 0; void signalHandler(int signal) { signalReceived = 1; } int main() { // 신호 처리기 설정 std::signal(SIGINT, signalHandler); std::cout << "프로그램 실행 중... (Ctrl+C를 눌러 종료)\n"; while (!signalReceived) { // 메인 루프 - 여기에 실제 작업 코드가 들어갈 수 있습니다. } std::cout << "SIGINT 신호를 받았습니다. 프로그램을 종료합니다.\n"; return 0; }
중요한 신호 값
- SIGINT: 인터럽트 신호. 일반적으로 Ctrl+C 입력 시 발생.
- SIGTERM: 종료 신호. 프로그램을 정상적으로 종료할 때 사용.
- SIGKILL: 강제 종료 신호. 프로그램을 강제 종료할 때 사용.
- SIGSEGV: 세그멘테이션 오류 신호. 잘못된 메모리 접근 시 발생.
- SIGABRT: 프로세스 중단 신호. abort 함수 호출 시 발생.
특수한 신호 처리기 값
- SIG_DFL: 기본 동작을 수행합니다. 이는 신호를 무시하거나 기본 동작(프로그램 종료 등)을 수행하는 것을 의미합니다.
- SIG_IGN: 신호를 무시합니다. 신호가 발생해도 아무 작업도 수행하지 않습니다.
부록 - sig_atomic_t
sig_atomic_t는 C 및 C++ 언어에서 신호 처리기(signal handler) 내에서 사용하기 위해 정의된 데이터 타입입니다. 이 타입은 다음과 같은 중요한 특징들을 가지고 있습니다:
- 원자성(Atomicity): sig_atomic_t 타입의 변수를 사용하면, 해당 변수에 대한 읽기 및 쓰기 연산이 원자적으로 수행됩니다. 이는 신호 처리기 내에서 데이터의 일관성을 보장하기 위함입니다. 즉, 신호 처리기가 실행되는 동안 해당 변수에 대한 연산이 중단되지 않습니다.
- 데이터 타입: sig_atomic_t는 통상적으로 정수형 타입이며, 일반적으로 int와 같은 크기를 가집니다. 하지만 플랫폼에 따라 크기와 구현이 달라질 수 있습니다.
- 사용 용도: 주로 신호 처리기 내부에서 플래그 변수나 단일 정수 값을 저장하는 데 사용됩니다. 이를 통해 메인 프로그램과 신호 처리기가 안전하게 데이터를 공유할 수 있습니다.
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++17 구조화된 바인딩(structured bindings) (0) 2024.07.23 생성자 이니셜라이저(initializer list) (0) 2024.07.23 std::bind(), std::function(), std::placeholder (0) 2023.12.28 iterator란 무엇인지, queue에서는 iterator가 없는 이유 (0) 2023.08.17 library 만들기 (0) 2023.03.30