리눅스에는 프로그램의 작성을 도와주기 위해 프로세스 대부분에 필요한 여러 라이브러리 함수가 있다.
시스템 콜은 보통의 함수 호출과는 다르게 C 언어 등의 고급언어에서는 직접 호출이 불가능하다. 아키텍처에 의존하는 어셈블리 코드를 사용해 호출한다.
만약 OS의 도움이 없다면 각 프로그램은 시스템 콜을 호출할 때마다 아키텍처에 의존하는 어셈블리 언어를 써서 고급언어로부터 어셈블리 코드를 호출해야만 한다.
OS의 도움이 없다면
이 방식은 프로그램을 작성하는데 시간이 오래 걸린다. 다른 아키텍처에도 사용할 수 없어 이식성도 매우 낮으며 이식할 수 없는 경우도 있다.
wrapper
OS
는 내부적으로 시스템 콜을 호출하는 일만 하는 함수를 제공하는데 이를 시스템 콜 wrapper
이라고 한다.
wrapper
함수는 아키텍처별로 존재한다. 고급언어로 써진 사용자 프로그램부터는 각 언어에 대응하여 준비된 시스템 콜의 wrapper
함수를 호출하기만 하면 된다.
사용자 프로그램은 wrapper 함수를 호출
C 언어에는 ISO에 의해 정해진 표준 라이브러리가 있다. 리눅스에는 이 표준 C 라이브러리가 제공되고 있다. 보통은 GNU 프로젝트가 제공하는 glibc
를 C 라이브러리로 사용한다. 대부분의 C 프로그램은 glibc
에 링크하고 있다.
glibc
는 시스템 콜의 wrapper
함수를 포함한다. 또한 POSIX 규격
에 정의된 함수도 제공한다.
POSIX 규격: 유닉스 계열의 OS가 갖추어야 할 각종 기능을 정해둔 규칙
프로그램이 어떠한 라이브러리를 통해 링크하고 있는가는 ldd
명령어를 사용하여 확인할 수 있다. 테스트로 echo
명령어에 대해 ldd
의 실행 결과를 본다.
실행 결과를 보면 libc
라는 부분이 표준 C 라이브러리에 해당한다
시스템에 의존하고 있는 여러 가지 프로그램에 대해 ldd
를 실행해보면 매우 많은 프로그램이 libc
에 링크되어 있음을 알 수 있다.
OS
가 제공하는 프로그램은 OS
가 제공하는 라이브러리와 마찬가지로 대부분의 프로그램이 필요하다. OS
의 동작을 변경시키는 프로그램도 OS
의 일부로써 제공한다.
OS가 제공하는 프로그램