C 신호 처리

C signal handling

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;     // 신호 상승 후 종료 } 

참고 항목

참조

  1. ^ ISO/IEC 9899:1999 specification (PDF). p. 258, § 7.14 Signal handling.
  2. ^ "The Open Group Base Specifications Issue 6 - signal.h - signals". Retrieved 10 January 2012.
  3. ^ http://man7.org/linux/man-pages/man2/signal.2.html 시그널(2) 맨 페이지