Interview/OS
Linux OS File Descriptor
김 정출
2024. 9. 26. 11:33
파일 디스크립터
- 파일 디스크립터(File Descriptor)는 Linux와 Unix 기반 운영체제에서 파일이나 입출력 리소스에 접근할 때 사용하는 추상적인 핸들입니다. 운영체제는 파일 디스크립터를 통해 파일, 소켓, 파이프, 표준 입출력 장치와 같은 다양한 입출력 자원을 관리하고 접근할 수 있습니다.
파일 디스크립터의 역할
- 파일 식별자 역할
- 파일 디스크립터는 운영체제 내부에서 열린 파일을 식별하는 데 사용됩니다. 프로세스가 파일을 열면, 운영체제는 해당 파일에 대한 파일 디스크립터를 생성하고, 이를 통해 프로세스가 파일에 접근할 수 있게 합니다.
- 파일 디스크립터는 정수 값으로, 운영체제는 이를 통해 열린 파일에 대한 메타데이터(파일의 위치, 상태 등)를 추적합니다.
- 입출력 연산 관리
- 파일 디스크립터는 파일과의 입출력(Read/Write) 작업에 사용됩니다.
- 예를 들어, read() 및 write() 같은 시스템 호출은 파일 디스크립터를 사용하여 어떤 파일을 읽거나 쓸지 지정합니다.
int fd = open("file.txt", O_RDONLY); // 파일 열기 read(fd, buffer, sizeof(buffer)); // 파일 읽기 close(fd); // 파일 닫기
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h> // open, close
#include <unistd.h> // read, write
#include <string.h> // strlen
#define FILENAME "example.txt"
#define BUFFER_SIZE 100
int main() {
// 파일 디스크립터
int fd;
char *text = "Hello, World!\\n";
char buffer[BUFFER_SIZE];
// 파일 쓰기
// O_WRONLY: 쓰기 전용, O_CREAT: 파일이 없으면 생성, O_TRUNC: 기존 파일 내용을 모두 지움
fd = open(FILENAME, O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (fd < 0) {
perror("Error opening file for writing");
return EXIT_FAILURE;
}
// 파일에 문자열 쓰기
ssize_t bytes_written = write(fd, text, strlen(text));
if (bytes_written < 0) {
perror("Error writing to file");
close(fd);
return EXIT_FAILURE;
}
// 파일 닫기
close(fd);
printf("Successfully wrote %zd bytes to %s\\n", bytes_written, FILENAME);
// 파일 읽기
// O_RDONLY: 읽기 전용
fd = open(FILENAME, O_RDONLY);
if (fd < 0) {
perror("Error opening file for reading");
return EXIT_FAILURE;
}
// 파일에서 문자열 읽기
ssize_t bytes_read = read(fd, buffer, BUFFER_SIZE - 1);
if (bytes_read < 0) {
perror("Error reading from file");
close(fd);
return EXIT_FAILURE;
}
// 읽은 데이터에 널 종료 문자 추가
buffer[bytes_read] = '\\0';
// 파일 닫기
close(fd);
// 읽은 내용 출력
printf("Read %zd bytes from %s: %s", bytes_read, FILENAME, buffer);
return EXIT_SUCCESS;
}