프로그램을 작성하다보면 개발자가 직접 함수를 만드는 경우도 있지만 이미 만들어진 함수를 이용하는 경우가 많다.
이와 같은 함수의 종류에는 시스템 콜라이브러리 함수 이라고 하는 함수가 있다.

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


이 코드를 컴파일 해서 실행하면 Segmentation fault 오류가 난다. 이유는 여기서 cur_time 변수는 포인터변수이다.
time()은  시스템 콜이다. 호출되면 커널 모드로 전환하고 커널에서 시스템의 시간 정보를 읽어 사용자 프로그램에 그 값을 전달해 준다.
그런데, 커널에서 넘겨준 시간을 사용자 프로그램에 보관을 하려고 보니 메모리 공간이 없다.
왜냐하면 포인터 변수만 선언하고 메모리 공간을 할당하지 않았기 때문이다. 따라서 세그멘테이션 오류가 발생한다.
 
다음과 같이 메모리 공간을 할당하면 올바르게 수행된다.


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


(2) 라이브러리 함수

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

이것을 컴파일해서 실행해보면 current time 이 문자열로 출력이 된다. 이 프로그램은 ctime()이라는 라이브 러리 함수를 이용한 예이다.
 
ctime()라이브러리 함수는 time() 시스템 콜에 의해 확인된 초단위의 시간정보를 사람들이 쉽게 확인 할수 있는 문자 형식으로 변환시켜주는 함수로 처리결과를 char* 로 반환한다.
즉, 주소 형태로 반환한다. 따라서 포인터 변수 등을 이용하여 결과를 처리해야한다.

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


(3) 시스템콜 & 라이브러리 함수




※ 출처 : http://babuzzzy.tistory.com/entry/1-리눅스-시스템프로그래밍-1

by 민트앤라떼 2011. 9. 29. 14:35