시스템콜 vs 라이브러리 👊🏻

funky·2023년 10월 20일
0
post-thumbnail
post-custom-banner
<시스템 프로그래밍 리눅스&유닉스(지은이:이종원)> 책을 공부하며 정리한 요약본입니다.

시스템 프로그래밍에 대하여

시스템 프로그래밍이란, 흔히 사용하는 응용 프로그래밍과 다르게 시스템에서 제공하는 시스템 호출을 이용해 프로그램을 작성하는 것임.

여기서 말하는 시스템호출(system call) 이란,
시스템이 제공하는 서비스를 프로그램에서 이용할 수 있도록 지원하는 '프로그래밍 인터페이스'임.

리눅스 시스템은 파일 시스템 접근, 사용자 정보, 시스템 정보, 시스템 시간 정보, 네트워킹 등 다양한 서비스를 제공하는데, 시스템 콜을 사용하면 리눅스 시스템 서비스를 직접! 이용하는 프로그램을 작성할 수 있다는 말씀.

리눅스/유닉스에서 동작하는 프로그램은 대부분 시스템 콜을 이용하기 때문에 꼬옥 알아야 함.


시스템 콜 ❔

다시한번 말하지만, 시스템 콜은 프로그래밍 인터페이스

기본 형식은

리턴값 = 시스템 호출명(인자, ...);

특징이라고 한다면,

  • 함수명처럼 사용할 이름이 정의되어 있음
  • 인자는 있을 수도, 없을 수도
  • 결괏값을 리턴하는 경우도 있지만 대부분은 성공이나 실패를 알려주는 정숫값을 리턴함.

요정도?


라이브러리 함수 ❔

라이브러리는 미리 컴파일된 함수를 묶어서 제공하는 특수한 파일

함수를 묶어서 라이브러리로 만드는 이유는,

독립적으로 자주 사용하는 기능을 구현해 프로그램 개발과 디버깅, 컴파일을 쉽고 빠르게 하기 위함이다.


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

시스템 콜은

커널의 해당 모듈을 직접 호출해 작업하고 결과를 리턴한다.
즉, 시스템을 직접 호출한다는 말! (그러니까 시스템 콜 이겠지 so 당연)

반면, 라이브러리 함수는

커널 모듈을 직접 호출하지 않는다.
라이브러리 함수에서 커널의 서비스를 이용하려면 함수 내부에서 시스템 콜을 사용한다.



오류 처리 방법 - 시스템 콜

먼저 알아둬야 할 것

시스템 호출은 성공적으로 수행하면 0을 리턴한다

//access()로 test.txt파일이 존재하는지 여부 검사하는 코드

#include <stdio.h>
#include <unistd.h>
#include <errno.h>

extern int errno;

int main(){
	if(access("test.txt", F_OK) == -1){
    	printf("errno=%d\n", errno);
    }
}    

그런데 만약 "test.txt 가 없는 상황이라면?

그렇다면, -1 을 리턴한다
뿐만 아니라 ! 전역변수 errno에 오류코드를 저장



오류 처리 방법 - 라이브러리 함수

//fopen()을 이용해 test.txt파일이 존재하는지 여부 검사하는 코드

#include <stdio.h>
#include <unistd.h>
#include <errno.h>

extern int errno;

int main(){
	FILE *fp;
    
	if((fp=fopen("test.txt", "r")) == NULL) {
    	printf("errno=%d\n", errno);
        exit(1);
    }
    fclose(fp);
}    

그런데 만약 "test.txt 가 없는 상황이라면?

라이브러리 함수의 경우, 오류가 발생하면 NULL를 리턴한다.
물론 함수 리턴값이 int형인 경우에는 -1을 리턴함
마찬가지로 errno 변수에 오류 코드를 저장함. (이건 시스템 콜과 동일)



profile
living Fun & Lucky
post-custom-banner

0개의 댓글