
CSAPP 10장인 시스템 수준의 입출력에 대해서 공부하고 있는데요.
"열린 파일이나 I/O 자원을 가리키는" 파일 디스크립터에 대해서 설명해보려고 합니다.
fd = open("foo.txt" , O_WRONLY|O_APPEND , 0)
printf("%d" , fd ) // 3
시스템 콜인 open 을 사용하면
정수값 3이 return 된 것을 볼 수 있어요.
저 값이 파일 디스크립터 입니다.

각각의 프로세스는 이런 Descripto table 을 가지고 있어요.
fd 로 적힌 부분이 파일 디스크립터 번호이고
파일 디스크립터는 0이상의 양의 정수로 이루어져 있어요.
파일 디스크립터의 0,1,2 는 각각
stdin stdout stderr 로 고정되어 있답니다.
우리가 시스템 콜 open을 사용했다는 건 "파일을 열었다"라는 뜻이겠죠?
이렇게 프로세스가 파일을 "열면" 커널은 해당 파일에 대한 정보를 저장하고 그걸 참조하기 위한 값 파일 디스크립터를 반환하는겁니다.
#include <fcntl.h>
#include <unistd.h>
int main() {
int fd = open("test.txt", O_RDONLY); // 파일을 열면 fd에 정수 반환됨
if (fd == -1) return 1;
char buf[100];
int n = read(fd, buf, sizeof(buf)); // fd를 통해 읽기
write(1, buf, n); // 표준출력으로 출력
close(fd); // 사용 후 닫아줘야 자원 누수 방지
return 0;
}

파일 디스크립터는 내부적으로 이런식으로 연결됩니다.
Descriptor table을 각각 가지고 있습니다.Descriptor table은 모든 프로세스가 공유하는 Open file table을 가리키고 있어요.Open file table에는 offset,mode,v-node로의 포인터 등 파일에 대한 정보가 있습니다.v-node table에는 실제 파일의 내용과 위치 등 상세한 파일 정보가 담겨있습니다.나눈 목적은 파일을 여러 프로세스에서 공유하기 위함이예요.
| 계층 | 이유 | 공유 여부 |
|---|---|---|
| ① 프로세스의 open file table | 같은 프로세스 내에서만 접근 가능하게 | 프로세스마다 독립 |
| ② System-wide open file table | offset 등 공유하고 리소스 낭비 줄이기 | 여러 프로세스가 공유 가능 |
| ③ inode table | 파일 시스템의 정보는 공통이어야 하니까 | 모든 프로세스가 공유 |
모든 프로세스가 각각 접근하는 open file table 파일 정보가 공유되어서 리소스 낭비를 줄이기 위함이고
inode table 을 사용해서 모든 파일에 대한 정보를 공유하게끔 만든거예요.
마무리
파일 디스크립터 자체에 대한 개념은 어렵지 않기 때문에 이해하고 있다면 좋을 것 같습니다.
C 공부하니까 자바스크립트 그리워....