이 문서는 Google Cloud Translation API를 사용해 자동 번역되었습니다.
어떤 문서는 원문을 읽는게 나을 수도 있습니다.
시스템 호출은 프로그램이 운영 체제에서 서비스를 요청하는 방법입니다. 라이브러리는 프로그램이 프로그래밍 언어에서 서비스를 요청하는 방법입니다.
이 기사에서는 시스템 호출과 라이브러리가 Linux에서 작동하는 방식을 살펴보겠습니다. 각각에 대한 간략한 개요부터 시작한 다음 몇 가지 구체적인 예를 살펴보겠습니다.
시스템 호출은 사용자 공간과 커널 공간 간의 인터페이스입니다. 프로그램이 운영 체제에서 서비스를 요청하는 방법입니다.
시스템 호출은 특별한 이름을 가진 함수를 호출하여 이루어집니다. 예를 들어, Linux에서 파일 읽기를 위한 시스템 호출은 read()
입니다.
시스템 호출은 함수에 인수를 전달하여 이루어집니다. 첫 번째 인수는 항상 시스템 호출을 식별하는 숫자입니다. 나머지 인수는 수행 중인 시스템 호출에 따라 다릅니다.
시스템 호출이 이루어지면 커널은 호출 프로그램에 호출 권한이 있는지 확인합니다. 호출이 허용되면 커널은 시스템 호출에 대한 코드를 실행합니다.
시스템 호출에 대한 코드는 일반적으로 어셈블리 언어로 작성됩니다. 이로 인해 프로그래머가 이해하고 디버그하기가 어렵습니다.
시스템 호출은 사용자 공간과 커널 공간 사이의 컨텍스트 전환을 수반하기 때문에 느립니다. 컨텍스트 스위치는 CPU가 한 프로세스의 상태를 저장하고 다른 프로세스의 상태를 로드하는 경우입니다.
시스템 호출도 보안 위험입니다. 버그가 있는 시스템 호출은 커널을 충돌시키거나 악의적인 사용자가 권한 있는 정보에 액세스하도록 허용할 수 있습니다.
라이브러리는 프로그램이 프로그래밍 언어에서 서비스를 요청하는 방법입니다.
라이브러리는 함수 모음으로 구성됩니다. 각 기능은 특정 작업을 수행합니다.
예를 들어 C 표준 라이브러리는 파일 읽기 및 쓰기, 문자열 조작 및 수학 연산 수행을 위한 함수를 제공합니다.
라이브러리는 일반적으로 라이브러리를 사용하는 프로그램과 동일한 언어로 작성됩니다. 이렇게 하면 프로그래머가 이해하고 디버깅하기가 더 쉬워집니다.
라이브러리는 컨텍스트 전환을 포함하지 않기 때문에 시스템 호출보다 빠릅니다.
또한 라이브러리는 버그가 있는 코드를 포함할 가능성이 적기 때문에 시스템 호출보다 더 안전합니다.
지금까지 시스템 호출과 라이브러리에 대한 간략한 개요를 살펴보았으므로 몇 가지 구체적인 예를 살펴보겠습니다.
다음은 시스템 호출을 사용하여 파일에서 읽는 방법의 예입니다.
#include <unistd.h>
int main() {
char buf[1024];
int n;
n = read(0, buf, sizeof(buf));
if (n < 0) {
perror("read");
return 1;
}
write(1, buf, n);
return 0;
}
read()
시스템 호출은 파일에서 데이터를 읽습니다. 첫 번째 인수는 파일 설명자입니다. 두 번째 인수는 데이터가 저장될 버퍼입니다. 세 번째 인수는 버퍼의 크기입니다.
write()
시스템 호출은 데이터를 파일에 씁니다. 첫 번째 인수는 파일 설명자입니다. 두 번째 인수는 데이터를 포함하는 버퍼입니다. 세 번째 인수는 쓸 바이트 수입니다.
다음은 라이브러리를 사용하여 파일에 쓰는 방법의 예입니다.
#include <stdio.h>
int main() {
FILE *fp;
char buf[1024];
int n;
fp = fopen("test.txt", "w");
if (fp == NULL) {
perror("fopen");
return 1;
}
n = fwrite(buf, 1, sizeof(buf), fp);
if (n < 0) {
perror("fwrite");
return 1;
}
fclose(fp);
return 0;
}
fopen()
함수는 파일을 엽니다. 첫 번째 인수는 파일의 경로입니다. 두 번째 인수는 모드입니다. 모드는 읽기의 경우 "r"
, 쓰기의 경우 "w"
, 추가의 경우 "a"
가 될 수 있습니다.
fwrite()
함수는 데이터를 파일에 씁니다. 첫 번째 인수는 데이터를 포함하는 버퍼입니다. 두 번째 인수는 각 요소의 크기입니다. 세 번째 인수는 쓸 요소의 수입니다. 네 번째 인수는 파일 포인터입니다.
fclose()
함수는 파일을 닫습니다. 인수는 파일 포인터입니다.
이 기사에서는 시스템 호출 및 라이브러리에 대한 간략한 개요를 살펴보았습니다. 또한 사용 방법에 대한 몇 가지 구체적인 예도 살펴보았습니다.