c 언어 에는 try catch 의 대체 방안 이 없습니다.

3139 단어 c 언어trycatch
setjmp 와 longjmp
접미사 jmp 가 가리 키 는 것 은 바로 jmp 입 니 다.이름 을 닫 으 면 이 두 형제 가 무엇 을 하 는 지 알 수 있 습 니 다.그들 둘 을 사용 하면 프로그램 이 흐름 을 제어 하고 이상 에 대한 처 리 를 실현 할 수 있다.
이상 처리 의 구 조 는 다음 과 같은 세 단계 로 나 눌 수 있다.
  • 준비 단계:커 널 스 택 에 유 니 버 설 레지스터 내용 저장
  • 처리 단계:하드웨어 오류 코드 와 이상 유형 번 호 를 저장 한 다음 현재 프로 세 스에 신 호 를 보 냅 니 다
  • 복구 단계:커 널 스 택 에 저 장 된 각 레지스터 내용 을 복원 하고 현재 프로 세 스 의 단전 처 로 돌아 가 계속 실행 합 니 다
  • 과정 은 약간 재 귀 와 유사 하 다.문자 만 네가 볼 수 있 는 것 은 약간 구름 과 안개 속 에 있다.우 리 는 작은 예 를 결합 하여 보 자.
    
    #include <stdio.h>
    #include <setjmp.h>
    
    static jmp_buf buf;
    
    void second(void) {
     printf("second
    "); // setjmp - setjmp 1 longjmp(buf, 1); } void first(void) { second(); // , second longjmp printf("first
    "); } int main() { int rc; rc = setjmp(buf); if (rc==0) { // ,setjmp 0 first(); } // longjmp ,setjmp 1, else if(rc==1){ printf("main
    "); } return 0; } /* the ressult as: second main */

    이제 두 함수 의 성명 을 다시 봅 시다.
  • setjmp(env):프로그램 컨 텍스트 를 env 에 저장 합 니 다
  • longjmp(env,status):env 는 setjmp 에 저 장 된 함수 실행 상태 변 수 를 말 합 니 다.status 는 setjmp 의 반환 값
  • 입 니 다.
    물론 당신 도switch으로 위의if else를 대체 할 수 있 습 니 다.사실은 try catch 는 위의 그 함수너 는 이것 을 참고 하여 try catch 를 실현 할 수 있다.에 해당 합 니 다.
    신호 처리
    개인 적 으로 이것 은 Liux 에서 더 잘 사용 되 고 더 많은 신 호 량 매크로 를 제공 했다 고 생각 합 니 다.
    다음은 signal 헤더 파일 의 정의 입 니 다.
    
    #define SIGINT   2 // interrupt
    #define SIGILL   4 // illegal instruction - invalid function image
    #define SIGFPE   8 // floating point exception
    #define SIGSEGV   11 // segment violation
    #define SIGTERM   15 // Software termination signal from kill
    #define SIGBREAK  21 // Ctrl-Break sequence
    #define SIGABRT   22 // abnormal termination triggered by abort call
    위 키 의 예 만 보 여 줍 니 다.
    
    #include <signal.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    static void catch_function(int signal) {
     puts("Interactive attention signal caught.");
    }
    
    int main(void) {
     if (signal(SIGINT, catch_function) == SIG_ERR) {
      fputs("An error occurred while setting a signal handler.
    ", stderr); return EXIT_FAILURE; } puts("Raising the interactive attention signal."); if (raise(SIGINT) != 0) { fputs("Error raising the signal.
    ", stderr); return EXIT_FAILURE; } puts("Exiting."); return 0; }
    총결산
    c 언어 에 try catch 의 대안 이 없 는 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 c 언어 try catch 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

    좋은 웹페이지 즐겨찾기