시스템 함수 와 C 라 이브 러 리 함수 호출 에 대한 몇 가지 오류 처리 방법

거의 모든 시스템 함수 와 라 이브 러 리 함수 가 실 행 될 때 특정한 값 을 되 돌려 성공 이나 실 수 를 설명 합 니 다.우 리 는 그것들 을 호출 한 후에 즉시 반환 값 을 검사 해 야 합 니 다. 만약 호출 이 잘못 되면 해당 하 는 처 리 를 해 야 합 니 다 (일반적으로 터미널 에 오류 정 보 를 출력 하고 프로그램 운행 을 중지 합 니 다).그렇지 않 으 면 앞으로 프로그램 이 잘못 되 었 을 때 디 버 깅 을 통 해 이 오 류 를 찾 는 데 오 랜 시간 이 걸 릴 것 이다.
물론 일부 시스템 호출 은 실패 하지 않 습 니 다 (예 를 들 어 getpid () 나 exit () 등). 호출 할 때 오류 검 사 를 하지 않 아 도 됩 니 다.
1. 시스템 호출 오류 발견
  • 모든 시스템 에서 호출 되 는 manual page 는 가능 한 반환 값 을 상세 하 게 소개 합 니 다.일반적으로 "- 1" 로 오 류 를 표시 하기 때문에 오류 검출 문 구 는 이렇게 쓸 수 있다.
  • fd = open(pathname, flags, mode);
    if(fd == -1){
        /* code to handle the error */
    }
    ...
        
    if(close(fd) == -1){
        /* code to handle the error */
    }

    시스템 호출 이 실 패 했 을 때 커 널 은 오류 유형 에 따라 error 를 특정한 비 마이너스 정 수 를 설정 합 니 다.헤더 파일 은 모든 가능 한 error 값 에 'E' 로 시작 하 는 매크로 이름 을 정의 합 니 다. 오류 처리 함수 에서 이 특정한 매크로 이름 을 감지 하여 오류 유형 을 판단 할 수 있 습 니 다.
    cnt = read(fd, buf, numtybes);
    if(cnt == -1){
        if(errno == EINTR)
            fprintf(stderr, "read was interrupted by a signal
    "
    ); else{ /*some other error occurred */ } }

    시스템 호출 이 성공 하면 error 를 0 으로 설정 하지 않 습 니 다.따라서 현재 시스템 함수 가 성공 적 으로 실 행 된 경우 가 있 을 수 있 습 니 다. 그러나 현재 error 값 은 예전 에 시스템 호출 오류 가 발생 했 을 때 설정 한 값 입 니 다. 이 를 위해 error 값 을 검 측 하여 어떤 오류 인지 판단 할 때 현재 시스템 호출 에 오류 가 발생 했 는 지 확인 해 야 합 니 다!
  • 일부 시스템 함수 들 은 오류 가 발생 했 을 때 '- 1' 을 되 돌려 주지 않 고 실행 에 성공 할 때 '- 1' 을 되 돌려 줍 니 다.이러한 상황 에서 우 리 는 시스템 호출 전에 error 를 0 으로 설정 하고 시스템 호출 이 끝 난 후에 error 가 0 인지 아 닌 지 를 판단 함으로써 오류 가 발생 했 는 지 를 알 수 있다.

  • 2. 시스템 호출 오 류 를 어떻게 처리 합 니까?
    시스템 호출 오류 에 대한 일반적인 처리 방법 은 error 값 을 기반 으로 서로 다른 오류 알림 메 시 지 를 출력 하 는 것 입 니 다.라 이브 러 리 함수 perror()strerror() 는 유사 한 기능 을 제공한다.
  • perror() 함수 가 사용자 정의 문자열 을 인쇄 한 다음 에 error 값 에 대응 하 는 오류 알림 문자열 을 출력 합 니 다.
  • #include 
    void perror(const char *msg);

    그것 을 사용 하 는 간단 한 예:
    fd = open(pathname, flags, mode);
    if(fd == -1){
        perror("open");
        exit(EXIT_FAILURE);
    }
  • strerror() 함 수 는 매개 변수 값 에 따라 특정한 오류 메 시 지 를 되 돌려 줍 니 다.
  • #include 
    char *strerror(int errnum);
    				//   errnum          

    strerror 함수 가 되 돌려 주 는 오류 메시지 문자열 이 있 는 공간 은 정적 으로 분 배 됩 니 다. 따라서 현재 오류 메 시 지 는 다음 strerror 함수 호출 에 덮어 씁 니 다.
    전 달 된 인자 errnum 이 불법 이 라면 "Unknown error nnn" 을 되 돌려 주 고, 일부 구현 에 있어 서 는 NULL 지침 을 되 돌려 줄 수도 있 습 니 다.
    더 많은 지식 을 얻 으 려 면 관심 사 를 클릭 하 십시오: 끼 워 넣 는 Linux & ARM CSDN 블 로그 약서 블 로그 지식 칼럼

    좋은 웹페이지 즐겨찾기