C 신호 처리
C signal handling| C 표준 라이브러리(libc) |
|---|
| 일반 주제 |
| 기타 헤더 |
C 표준 라이브러리에서 신호 처리란 프로그램이 실행하는 동안 다양한 신호를 처리하는 방법을 정의한다.신호는 프로그램 내에서 일부 예외적인 동작을 보고하거나(예: 0으로 나누기), 프로그램 외부에서 일부 비동기 이벤트를 보고할 수 있다(예: 키보드에서 대화형 주의 키를 치는 사람).
표준 신호
C 표준은 6개의 신호만 정의한다.모두 에 정의되어 있다.signal.h머리글 ()csignal머리글([1]C++):
SIGABRT- "불완전", 비정상 종료SIGFPE- 부동 소수점 예외.SIGILL- "오류", 잘못된 지시SIGINT- 프로그램에 전송된 대화형 주의 요청인 "동작".SIGSEGV- "기억 위반", 잘못된 메모리 액세스.SIGTERM- 프로그램에 보낸 종료 요청서 "해제"
에 추가 신호가 지정될 수 있음signal.h시행에 의한 헤딩예를 들어, 리눅스 같은 유닉스 및 유닉스 유사 운영 체제는 15개 이상의 추가 신호를 정의한다. 유닉스 신호를 참조하십시오.[2]
디버깅
SIGTRAP디버깅을 위해.플랫폼에 의존하며 Unix와 유사한 운영 체제에서 사용될 수 있다.
처리
전화를 걸면 신호가 생성될 수 있음raise()또는kill()시스템 호출 raise()현재 공정에 신호를 보내고kill()특정 프로세스에 신호를 전송한다.
신호 핸들러는 해당 신호가 발생할 때 대상 환경에 의해 호출되는 기능이다.대상 환경은 신호 처리기가 돌아오거나 호출할 때까지 프로그램 실행을 중지함longjmp().
신호 핸들러는 다음으로 설정할 수 있음signal()또는sigaction(). 의 행동signal()역사를 통틀어 여러 번 바뀌었고 현재는 더 이상 사용되지 않는 것으로 간주되고 있다.[3]신호의 처리를 SIG_DFL이나 SIG_IGN으로 설정할 때만 휴대할 수 있으며, 신호 처리기는 2개의 신호를 제외하고 모두 지정할 수 있다(SIGKill과 SIGSTOP은 잡거나 차단하거나 무시할 수 없다).
신호가 프로그램 내에서 오류를 보고하고 신호가 비동기적이지 않은 경우, 신호 핸들러는 호출을 통해 종료될 수 있다.abort(),exit()또는longjmp().
기능들
| 함수 | 설명 |
|---|---|
raise | 인공적으로 호출 과정에 신호를 보내다. |
kill | 인위적으로 특정 공정으로 신호를 보내다 |
signal | 프로그램이 특정 신호를 수신할 때 수행할 작업을 설정하십시오. |
사용 예
#include <signal.h> #include <stdio.h> #include <stdlib.h> 정태의 공허하게 하다 catch_function(인트로 서명하다) { 놓다("인터랙티브 주의 신호가 잡혔어."); } 인트로 본래의(공허하게 하다) { // 위의 기능을 SIGINT 신호의 신호 핸들러로 설정: 만일 (신호를 보내다(시긴트, catch_function) == SIG_ERR) { 풋볼("신호 핸들러를 설정하는 동안 오류가 발생했소.\n", 더부룩한); 돌아오다 EXIT_Failure; } 놓다("인터랙티브 주의 신호 올리기."); 만일 (높이다(시긴트) != 0) { 풋볼("신호를 올리는 데 에러가 났소.\n", 더부룩한); 돌아오다 EXIT_Failure; } 놓다("출장."); 돌아오다 EXIT_SUPTION; // 신호 상승 후 종료 } 참고 항목
참조
- ^ ISO/IEC 9899:1999 specification (PDF). p. 258, § 7.14 Signal handling.
- ^ "The Open Group Base Specifications Issue 6 - signal.h - signals". Retrieved 10 January 2012.
- ^ http://man7.org/linux/man-pages/man2/signal.2.html 시그널(2) 맨 페이지