운영체제 과제를 하면서 다루었던 파일 시스템을 운용하는 주요 함수들과 구조체에 대해서 간단하게 정리해보려고 합니다
open 함수는 파일을 열거나 생성하기 위해 사용됩니다
int fd = open("example.txt", O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
if (fd == -1) {
perror("open");
return 1;
}
close 함수는 열린 파일 디스크립터를 닫습니다
if (close(fd) == -1) {
perror("close");
return 1;
}
read 함수는 파일에서 데이터를 읽습니다
char buffer[1024];
ssize_t bytes_read = read(fd, buffer, sizeof(buffer));
if (bytes_read == -1) {
perror("read");
return 1;
}
write 함수는 파일에 데이터를 씁니다
const char *str = "Hello, world!";
ssize_t bytes_written = write(fd, str, strlen(str));
if (bytes_written == -1) {
perror("write");
return 1;
}
이 네 가지 함수들을 사용해서 파일 처리, 데이터 읽기 및 쓰기와 같은 기본적인 파일 시스템 작업을 수행합니다
Q. 파일 디스크립터가 뭔가요?
A: 파일 디스크립터(File Descriptor)는 운영 체제가 프로세스에서 파일이나 다른 입출력 리소스(예: 파이프, 네트워크 연결)에 접근할 수 있도록 제공하는 추상화된 핸들입니다.
운영 체제는 파일 디스크립터를 사용하여 프로세스와 파일 시스템 간의 인터페이스를 관리합니다. 프로그램이 파일을 열 때, 운영 체제는 해당 파일에 대한 접근 권한을 검사하고, 접근이 허용되면 내부적으로 파일에 대한 참조를 생성하고 해당 참조에 대응하는 파일 디스크립터를 프로그램에게 반환합니다.
리눅스와 유닉스 계열 운영 체제에서는 기본적으로 세 가지 파일 디스크립터가 자동으로 할당됩니다:
이러한 방식으로 파일 디스크립터는 프로그램이 시스템의 입출력 리소스에 접근하고 조작하는 데 필수적인 역할을 합니다. 파일 디스크립터를 통해 운영 체제는 프로세스가 리소스를 효율적으로 관리할 수 있도록 지원합니다.
Q. open, close, read, write 함수들과 fopen, fclose, fread, fwrite와 같이 f로 시작하는 함수들 차이는 뭔가요?
A: 주요 차이는 운영 체제 수준의 시스템 호출과 라이브러리 레벨의 추상화 간의 차이에 있습니다.
시스템 호출 함수 (open, close, read, write)
표준 입출력 라이브러리 함수 (fopen, fclose, fread, fwrite)
정리하자면, 표준 입출력 라이브러리 함수들은 일반적으로 포터블 코드를 작성하는 데 있어 선호되며, 시스템 호출 함수들은 더 낮은 수준의 제어가 필요한 경우에 사용됩니다.