linux/system programming2011. 6. 27. 21:59
ㅇ- 에러코드를 담고 있는 error 변수
- perror() 함수를 이용한 오류 메시지 출력
- strerror() 함수를 이용한 오류 메시지 출력
 
개요

- 리눅스에서 시스템콜 및 라이브러리 함수를 수행하다가 오류가 발생되면
  사용자의 프로그램으로 오류 결과를 넘겨준다
 
- 사용자 프로그램에서는 함수의 리턴 값을 조회함으로써 오류의 발생 여부를 확인할수 있다.
 
- 일반적으로 오류 시 리턴 값은 다음과 같다.
     시스템 콜 오류 시 리턴 값 : -1
     라이브러리 함수 오류 시 리턴 값 : NULL

- 위의 리턴 값과 함께 오류를 확인할 수 있는 방법을 좀 더 자세히 살펴보자
 
 에러 코드를 담고 있는 error 변수
시스템 콜 오류 시 리턴 값은 보통 -1 이 리턴 된다고 했다.
그럼, 시스템 콜이 오류가 나는 원인은 한가지 일까 여러가지 일까
시스템 콜의 오류 발생 시에 오류의 원인을 구체적으로 파악할수 있는 방법이 없을까?

시스템 콜은 오류가 나는 경우에 구체적인 원인을 나타내는 상수 값을 errno 변수에 저장한다
그러므로 시스템 콜 오류시에는 errno 변수의 내용을 살펴봄으로써 오류의 원인을 구체적으로 파악할 수
있게 된다

errno 변수에 설정되는 값은 /usr/include/asm/errno.h 헤더 파일에 정의되어 있다.
실제로는 /usr/include/asm-generic/errno-base.h 을 포함하고 있기 때문에 이파일을 열어야한다.

그럼 에러노 변수는 어디에 있을까?
==>$ whereis errno.h 명령어로 알수 있다.
 사용자 어플리케이션에서 errno변수를 사용하기 위해서는  
#include<errno.h> 를 반드시 포함해야한다 


 sys_nerr  , sys_errlist

 
errno와 연관된 추가적인 변수들도 stdio.h 파일에 선언됨

sys_nerr, sys_errlist 사용 예


컴파일후 결과

예제와 출력 결과를 보면
sys_nerr는 포함하고 있는 에러메시지의 개수를 나타내고
sys_errlist 는 포인터 배열로 에러메시지를 문자열로 저장하고 있는걸 알수있다


perror() 함수를 이용한 오류 메시지 출력 

 오류 메시지를 출력할 때 가장 널리 사용되는 함수는 perror()로 그 형식은 다음과 같다.
 
#include <stdio.h>
void perror(const char *s);
이때 매개 변수 s 에는 오류 메시지 앞에 덧붙이고 싶은 문자열을 전달하면 된다.

myperror.c 오류 메시지 출력 예


실행을 하면 ./myperror
open : No such file or directory perror에서 open을 썻기때문에 open 이라고 출력
 
strerror() 함수를 이용한 오류 메시지 출력

오류 메시지를 출력할때 널리 사용하는 함수는 strerror()로 그 형식은 다음과 같다
#include <string.h>

char *strerror(int errnum);
errnum 에 맞는 오류 메시지 문자열을 리턴한다.
만일 잘못된 errnum을 인자로 넘겨주면 " Unknown error nnn " 문자열을 리턴한다


실행 예


결론

이제까지 살펴본대로 각종 시스템 콜이나 라이브러리 함수의 오류 처리가 필요한 경우
오류 메시지 출력은 strerror() 또는 perror() 함수를 이용하고

오류의 원인에 따라 프로그램의 제어가 필요할 때는 메뉴얼(man)에 정의된 대로 error 변수의 값에따라 
처리를 한다

 
Posted by babuzzzy