리눅스 오류처리하기 2007. 11. 28 안효창
라이브러리함수의오류번호얻기 errno 변수기능오류번호를저장한다. 기본형 extern int errno; 헤더파일 <errno.h> 라이브러리함수호출에실패했을때함수예 정수값을반환하는함수 -1 반환 open 함수 포인터를반환하는함수 NULL 반환 fopen 함수 2 유닉스 / 리눅스
라이브러리함수의오류번호얻기 19-1 1 19-2 #include <errno.h> /* errno 변수를선언하는헤더 #include <sys/types.h> 파일 */ #include <sys/stat.h> FILE *fp; #include <fcntl.h> #include <errno.h> /* fopen 함수호출에실패하면 NULL을반환 */ int fd; if ((fp=fopen("nodata", "r")) == NULL) /* nodata 파일을읽기전용으로연다. */ printf("errno = %d n", errno); /* 오류발생하면 if ((fd=open("nodata", O_RDONLY)) == 1) /* errno 에오류번호저장 */ exit(1); /* 종료 open 함수호출에실패하면 -1 반환 */ 하기 */ printf("errno = %d n", errno); /* 오류발생하 면 errno에오류번호저장 */ exit(0); /* 종료하기 */ exit(1); exit(0); 3 유닉스 / 리눅스
라이브러리함수의오류번호얻기 19-3 #include <math.h> /* sqrt 함수를정의하는헤더파일 */ #include <errno.h> /* errno 변수를선언하는헤더파일 */ double y; errno = 0; /* errno 를 0 으로초기화 */ y = sqrt(-1); /* sqrt 함수의인수로음수값이올수없으므로호출오류발생 */ /* errno 가 0 이아니라는것은오류가발생했음을의미 */ if (errno!= 0) printf("errno = %d n", errno); /* errno 에저장된오류번호출력 */ exit(1); exit(0); 4 유닉스 / 리눅스
라이브러리함수의오류번호얻기 errno.h #define EPERM 1 /* Operation not permitted */ #define ENOENT 2 /* No such file or directory */ #define ESRCH 3 /* No such process */ #define EINTR 4 /* Interrupted t system call */ #define EIO 5 /* I/O error */ #define ENXIO 6 /* No such device or address */ #define E2BIG 7 /* Arg list too long */ #define ENOMEDIUM 123 /* No medium found */ #define EMEDIUMTYPE 124 /* Wrong medium type */ 5 유닉스 / 리눅스
라이브러리함수의오류번호얻기 19-4 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <errno.h> int fd; /* open 함수호출에실패하면 -1 이반환 */ if ((fd=open("nodata", O_RDONLY)) == -1) /* ENOENT 는 그와같은파일또는디렉토리가없다 는의미의매크로 */ if (errno == ENOENT) printf("nodata is not exist n"); else printf("unexpected error: errno = %d n", errno); exit(1); exit(0); 6 유닉스 / 리눅스
오류메시지출력하고종료하기 assert 함수기능 expression이거짓이면오류메시지출력, 코어덤프하고프로그램종료한다. 기본형 void assert(int expression); expression : 참과거짓을판별하는수식반환값없음헤더파일 <assert.h> 7 유닉스 / 리눅스
오류메시지출력하고종료하기 19-5 19-6 #include <assert.h> /* assert 함수를정의하는헤 #define NDEBUG /* NDEBUG를정의하면 assert 더파일 */ 호출문장을실행하지않음 */ FILE *fp; fp=fopen("yesdata", "r"); /* fp 가참이므로아무일하지않고다음문장을실행한다. */ assert(fp); printf("yesdata exist n"); fclose(fp); /* fp 닫음 */ fp=fopen("nodata", "r"); /* nodata 없으므로 NULL 반환 */ assert(fp); /* fp 가거짓이므로오류메시지출력, 코어덤프하고종료 */ /* 이후문장실행되지않음 */ printf("nodata exist n"); fclose(fp); exit(0); #include <assert.h> FILE *fp; fp=fopen("yesdata", "r"); assert(fp); /* 실행되지않음 */ printf("yesdata exist n"); fclose(fp); fp=fopen("nodata", "r"); assert(fp); /* 실행되지않음 */ printf("nodata exist n"); fclose(fp); exit(0); 8 유닉스 / 리눅스
무조건종료하기 abort 함수 기능코어덤프하고프로그램종료한다. 기본형 void abort(void); 반환값없음헤더파일 <stdlib.h> 9 유닉스 / 리눅스
무조건종료하기 19-7 #include <stdlib.h> /* abort 함수를정의하는헤더파일 */ abort(); /* 코어덤프하고프로그램종료 */ /* 이후문장실행되지않음 */ printf("not run n"); 10 유닉스 / 리눅스
무조건종료하기 assert 함수에서 abort 함수이용 11 유닉스 / 리눅스
무조건종료하기 19-8 FILE 은소스파일의이름을, LINE 는현재라인번호를의미하는매크로 #include <stdlib.h> /* abort 함수를정의하는헤더파일 */ void my_assert(int expression); my_assert(7 == 7); printf("yes n"); my_assert(3 == 5); printf("no n"); void my_assert(int expression) if(!(expression)) /* expression 이거짓이면 */ /* FILE 은소스파일, LINE 은현재라인 */ printf("%s:%d:assertion failed. n", FILE, LINE ); abort(); 12 유닉스 / 리눅스
오류번호로오류원인얻기 strerror 함수기능오류번호를설명하는문자열을반환한다. 기본형 char *strerror(int errnum); errnum : 오류번호반환값성공 : 오류번호를설명하는문자열실패 : unknown error 메시지헤더파일 <string.h> 13 유닉스 / 리눅스
오류번호로오류원인얻기 19-9 9 19-10 10 #include <string.h> /* strerror 함수를정의하는헤 #include <string.h> /* strerror 함수를정의하는헤더파일 */ 더파일 */ FILE *fp; /* fopen 함수호출에실패하면 NULL이반환 */ if ((fp=fopen("nodata", "r")) == NULL) /* errno를설명하는문자열을표준오류인모니터로출력 */ fprintf(stderr, "ERROR: %s n", strerror(errno)); exit(1); exit(0); int i; /* 오류번호 1-124에대한설명출력 */ for (i=0; i<125; i++) printf("[%3d] %s n", i, strerror(i)); exit(0); i(0) 14 유닉스 / 리눅스
오류메시지출력하기 perror 함수기능오류메시지를출력한다. 기본형 void perror(const char *s); s : 오류발생시오류메시지앞부분에출력할문자열반환값없음헤더파일 <stdio.h> 15 유닉스 / 리눅스
오류메시지출력하기 perror 함수에서 strerror 19-11 11 함수이용 FILE *fp; perror("error"); fprintf(stderr, "ERROR: %s n", strerror(errno )); if ((fp=fopen("nodata", "r")) == NULL) /* fopen 함수호출오류발생하면 */ perror("error"); exit(1); exit(0); i(0) my_perror(char *str) fprintf(stderr, "%s: %s n", str, strerror(errno )); 16 유닉스 / 리눅스