상세 분석 C++신호 처리

신 호 는 운영 체제 에서 프로 세 스 에 전 달 된 중단 으로 프로그램 을 일찍 종료 합 니 다.UNIX,LINUX,Mac OS X 또는 Windows 시스템 에 서 는 Ctrl+C 를 누 르 면 중단 이 발생 할 수 있다.
일부 신 호 는 프로그램 에 포착 되 지 않 지만 아래 표 에 열 거 된 신 호 는 프로그램 에서 포착 할 수 있 고 신 호 를 바탕 으로 적당 한 동작 을 취 할 수 있다.이 신 호 는 C+헤더 파일에 정의 되 어 있 습 니 다.
시그 널
묘사 하 다.
SIGABRT
호출 과 같은 프로그램의 이상 종료 abort。
SIGFPE
잘못된 산술 연산,예 를 들 어 0 으로 나 누 거나 넘 치 는 조작.
SIGILL
불법 지령 을 검사 하 다.
SIGINT
프로그램 종료(interrupt)신호.
SIGSEGV
메모리 에 불법 으로 접근 하 다.
SIGTERM
프로그램 에 보 내 는 종료 요청 입 니 다.
signal()함수
C++신호 처리 라 이브 러 리 는 돌발 사건 을 포착 하기 위해 signal 함 수 를 제공 합 니 다.다음은 signal()함수 의 문법 입 니 다.
void (*signal (int sig, void (*func)(int)))(int);
이 함 수 는 두 개의 인 자 를 수신 합 니 다.첫 번 째 인 자 는 하나의 정수 로 신호 의 번 호 를 대표 합 니 다.두 번 째 매개 변 수 는 신호 처리 함 수 를 가리 키 는 지침 이다.
signal()함수 로 SIGINT 신 호 를 캡 처 하 는 간단 한 C++프로그램 을 만 듭 니 다.프로그램 에서 어떤 신 호 를 잡 으 려 고 하 든 signal 함수 로 신 호 를 등록 하고 신호 처리 프로그램 과 연결 해 야 합 니 다.아래 의 실례 를 보십시오.

#include <iostream>
#include <csignal>
#include <unistd.h>
 
using namespace std;
 
void signalHandler( int signum )
{
  cout << "Interrupt signal (" << signum << ") received.
"; // // exit(signum); } int main () { // SIGINT signal(SIGINT, signalHandler); while(1){ cout << "Going to sleep...." << endl; sleep(1); } return 0; }
위의 코드 가 컴 파일 되 고 실 행 될 때 다음 과 같은 결 과 를 얻 을 수 있 습 니 다.
Going to sleep....
Going to sleep....
Going to sleep....
현재 Ctrl+C 를 누 르 면 프로그램 을 중단 합 니 다.프로그램 캡 처 신 호 를 볼 수 있 습 니 다.프로그램 은 다음 과 같은 내용 을 인쇄 하고 종료 합 니 다.
Going to sleep....
Going to sleep....
Going to sleep....
Interrupt signal (2) received.
raise()함수
함수 raise()를 사용 하여 신 호 를 생 성 할 수 있 습 니 다.이 함 수 는 정수 신호 번 호 를 매개 변수 로 하고 문법 은 다음 과 같 습 니 다.
int raise (signal sig);
여기 서 sig 는 보 낼 신호 의 번호 입 니 다.이 신 호 는 SIGINT,SIGABRT,SIGFPE,SIGLL,SIGSEGV,SIGTERM,SIGUP 을 포함 합 니 다.다음은 raise()함수 내부 에서 신 호 를 생 성 하 는 실례 입 니 다.

#include <iostream>
#include <csignal>
#include <unistd.h>
 
using namespace std;
 
void signalHandler( int signum )
{
  cout << "Interrupt signal (" << signum << ") received.
"; // // exit(signum); } int main () { int i = 0; // SIGINT signal(SIGINT, signalHandler); while(++i){ cout << "Going to sleep...." << endl; if( i == 3 ){ raise( SIGINT); } sleep(1); } return 0; }
위의 코드 가 컴 파일 되 고 실 행 될 때 다음 과 같은 결 과 를 얻 고 자동 으로 종 료 됩 니 다.
Going to sleep....
Going to sleep....
Going to sleep....
Interrupt signal (2) received.
이상 은 C++신호 처리 의 상세 한 내용 을 상세 하 게 분석 하 는 것 입 니 다.C+신호 처리 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 세 요!

좋은 웹페이지 즐겨찾기