시스템 함수 와 C 라 이브 러 리 함수 호출 에 대한 몇 가지 오류 처리 방법
6664 단어 c시스템 함수프로 그래 밍 언어linuxc 언어
물론 일부 시스템 호출 은 실패 하지 않 습 니 다 (예 를 들 어 getpid () 나 exit () 등). 호출 할 때 오류 검 사 를 하지 않 아 도 됩 니 다.
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 값 을 검 측 하여 어떤 오류 인지 판단 할 때 현재 시스템 호출 에 오류 가 발생 했 는 지 확인 해 야 합 니 다!
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 블 로그 약서 블 로그 지식 칼럼
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Docker를 사용한 React 및 .NET Core 6.0 샘플 프로젝트 - 1부이 기사에서는 Entity Framework Core Code First 접근 방식을 사용하는 ASP.NET Core 6.0 WEP API의 CRUD(만들기, 읽기, 업데이트 및 삭제) 작업에 대해 설명합니다. 웹 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.