시스템 프로그램의 개요

System Program 2013. 8. 5. 13:08

1. 시스템 호출이란

   

커널로의 진입점이며, 이를 통해서 프로세서가 커널에게 프로세스 대신 어떤 동작을 수행하도록 요청할 수 있다.

커널은 API를 통해서 광범위한 서비스를 제공한다.

   

1.1 시스템 호출의 일반적인 사항

  • 시스템 호출은 프로세스의 상태를 사용자모드에서 커널모드로 변경해서 CPU가 보호된 커널 메모리에 접근할 수 있다.
  • 시스템 호출 목록은 고정되어 있다. 각 시스템 호출에는 고유한 숫자가 붙여 있다.
  • 표준 C 라이브러는 시스템 호출함수를 Wapping하고 있는 함수를 제공한다.

                (예로, fopen --> open --> sys_open 순)

   

2. 표준 C 라이브러리 : GNU C 라이브러리(glib)

   

유닉스는 구현에 따라서 표준 C 라이브러리의 구현이 다를 수 있다. 리눅스에서는 가장 널리 쓰이는 구현은 GNU 라이브러리이다.

   

2.1. 참조 사이트

 - glib, http://www.gnu.org/software/libc/

   

2.2. glibc 버전 및 위치 확인

   

2.2.1. 쉘상에서 확인 방법 

   

[shell 상에서 확인 내용]

/lib # ./libc.so.6
GNU C Library stable release version 2.9, by Roland McGrath et al.
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.3.2.
Compiled on a Linux >>2.6.17-10-generic<< system on 2009-07-24.
Available extensions:
 crypt add-on version 2.1 by Michael Glad and others
 Native POSIX Threads Library by Ulrich Drepper et al
 Support for some architectures added on, not maintained in glibc core.
 BIND-8.2.3-T5B
For bug reporting instructions, please see:
<http://www.gnu.org/software/libc/bugs.html>.

   

2.2.2. 라이브러리 위치가 lib 폴더에 있지 않을 경우 확인 방법

   

라이브러리는 항상 

 - $ ldd mypro | grep libc

   

소스상에서는 매크로 정의나 버전정보를 리턴하는 함수를 사용할 수 있다.

 - __GLIBC__  and __GLIBC_MINOR__

 - const char *gnu_get_libc_version(void) --> (#include <gnu/libc-version.h> 필요)

   

3. 시스템 호출과 라이브러리 함수의 에러처리

 

거의 대부분의 시스템 호출과 라이브러리 함수가 어떤 형태로든 성공여부를 나타내는 상태 값을 리턴 한다.  

   

 3.1. 시스템 호출 에러 처리

 

시스템 호출의 매뉴얼 페이지에는 가능한 리턴값들이 나와 있다. (vi editor에서 shift + k로 확인가능) .

일반적으로 시스템 호출이 성공하면 '0'의 값을 리턴하는 것이 통상적인 동작이다.

시스템 호출이 실패하면 전역 정수 변수 errno를 특정 에러를 나타내는 양수로 설정한다. 헤더 파일 <errno.h>를 사용하면

errno 선언 뿐만 아니라 다양한 에러 상수도 확인할 수 있다.

 

 3.2. 시스템 호출의 에러 출력

 

시스템 호출이 실패한 후의 일반적인 동작은 errno값에 따라 에러 메시지를 출력하는 것이다. 아래와 같은 라이브러리 함수를 사용하면 된다.

 

#include <errno.h>

void perror(const char *msg)

   

에러 number에 해당하는 에러 문자열을 출력한다.

#include <string.h>

void *strerror(int errnum)

   

[사용 예시]

fd = open(pathname, flag, mode)

 

if(fd == -1) {

    perror("open");

    exit(EXIT_FAILURE);

}

   

3.3 라이브러리 함수의 에러 처리

 

다양한 라이브러리 함수가 실패를 알리기 위해서 여러 가지 데이터형의 여러 가지 값을 리턴한다.

따라서 일반적인 에러 처리 방식을 아래와 같이 분류할 수 있다.

 

  • 시스템 호출과 똑같이 에러 정보를 리턴하는 라이브러리 함수. '-1'을 리턴하고 구체적인 에러 값을 errno에 적는다.
  • 에러 발생 시 '-1'을 리턴하지는 않지만 errno에 구체적인 에러 값을 적는다.
  • errno을 전혀 쓰지 않는 나머지 라이브리 함수. 이 경우 perror()나 strerror()함수를 사용하여 에러를 진단해서는 안된다.

 

정리하면 정확한 에러 처리를 위해서는 매뉴얼을 확인하는 것이 최선의 방법인 것 같다.

   

  

: