linux/system programming2011. 6. 22. 22:36
프로그램을 작성하다보면 개발자가 직접 함수를 만드는 경우도 있지만
이미 만들어진 함수를 이용하는 경우가 많다.

이와 같은 함수의 종류에는 라이브러리 함수와 시스템 콜 이라고 하는 함수가 있다.

이번 에는 라이브러리 함수와 시스템 콜의 차이점을 알아보고, 자주 사용되는 각 함수들의 목록을 확인해보자

 라이브러리 함수와 시스템 콜의 차이

일반적으로 시스템 콜이란 커널의 자원을 사용자가 사용할 수 있도록 만들어 놓은 함수들을 말한다
ex) -open 시스템 콜 호출
     - 시스템 콜을 호출하면 커널 모드로 전환하여 실행됨

그에 비해 라이브러리 함수란 사용자들이 많이 사용할 것같은 기능들을 미리 함수로 만들어 놓은 것
- 문자열 처리, 표준 입출력, 수학 관련 공식 등
- 라이브러리 함수를 호출하여도 사용자 프로그램은 사용자 모드에서 실행됨
시스템 콜 예문


 time() 함수는 시스템의 시간을 확인할 때 사용하는 시스템 콜이다. 
이 함수에 대한 자세한 사용법은 온라인 메뉴얼 명령 man의 시스템 콜에 대한 섹션 2에서 확인할 수 있다.
 
man 2 time 명령을 수행하면 time() 시스템 콜에 대한 문법과 함께 파라미터, 리턴값 등에 대한 자세한 정보를 알 수 있다

리눅스에서 프로그램을 잘 작성하려면 온라인 메뉴얼을 자주 참조해야한다.
 


이 코드를 컴파일 해서 실행하면 
Segmentation fault 오류가 난다 이유는
여기서 cur_time 변수는 포인터변수이다
time()은  시스템 콜이다. 호출되면 커널 모드로 전환하고 커널에서 시스템의 시간 정보를 읽어 사용자 프로그램에
그 값을 전달해 준다

그런데 커널에서 넘겨준 시간을 사용자 프로그램에 보관을 하려고 보니 메모리 공간이 없다
왜냐하면 포인터 변수만 선언하고 메모리 공간을 할당하지 않았기 때문이다.

따라서 세그멘테이션 오류가 발생한다.


 프로그램을 실행해보면 올바르게 수행된다
여기에서 time()과 같은 시스템 콜은 사용자 프로그램에서 커널의 메모리 공간을 직접 이용할 수 없으므로 사용자 프로그램에서 메모리 공간을 할당해야 한다는 점을 기억하자 

이제는 라이브러리 함수의 예를 보자

 이것을 컴파일해서 실행해보면 current time 이 문자열로 출력이 된다

이 프로그램은 ctime()이라는 라이브 러리 함수를 이용한 예이다
리눅스에서 라이브러리 함수에 대핸 온라인 메뉴얼은 섹션 3에서 확인 할수 있다
man 3 ctime
 
ctime()라이브러리 함수는 time() 시스템 콜에 의해 확인된 초단위의 시간정보를 사람들이
쉽게 확인 할수 있는 문자 형식으로 변환시켜주는 함수로 처리결과를 char* 로 반환한다

즉 주소 형태로 반환한다. 따라서 포인터 변수 등을 이용하여 결과를 처리해야한다

소스 코드 8~11 을 보면 time_str이라는 포인터 변수가 선언되고 특별한 메모리 할당이 없이도 ctime()
함수의 리턴값을 정상적으로 처리하고 있다

 함수 설명 
ctime  
ctime() 함수는 라이브러리 함수로 사용자 모드에서 처리되는 함수이다.
이 함수를 호출하면 사용자 공간에 메모리 공간을 할당하고 문자 형식으로 변환된 시간 정보를 저장한다

따라서 사용자 프로그램은 자신의 공간에 할당된 그 부분을 포인터 변수를 통해 참조할 수 있게 된다
그러므로 라이브러리 함수를 이용하는 경우에는 사용자 프로그램에서 별도의 공간을 만들지 않아도
함수의 처리 결과를 이용할 수 있다.

시스템 콜 vs 라이브러리 함수



Posted by babuzzzy