- 유닉스 계열에서 모든 객체들(정규파일, 디렉터리, 소켓, 파이프 등등)은 모두 '파일'로써 관리가 됨.
- 시스템에서 이 파일들을 접근할 때, 파일 디스크립터를 이용
- 프로세스가 실행 중에 파일을 오픈하면 커널은 해당 프로세스의 파일 디스크립터 숫자 중에 사용하지 않는 가장 작은 값, fd값을 할당
이후 프로세스가 열려있는 파일에 시스템 콜을 이용해 접근할 때, fd값을 이용하여 파일을 지칭.
fd값에는 기본적으로 할당되는 파일 디스크립터가 존재
표준 입력 : STDIN_FILENO -> 0
표준 출력 : STDOUT_FILENO -> 1
표준 에러 : STDERR_FILENO -> 2
<unistd.h>에서 파악할 수 있음
- 리눅스에서는 프로세스마다 파일 디스크립터 테이블을 가지고 있음.
파일 디스크립터 테이블은 open등에서 사용한 flags와 파일 테이블 요소의 위치정보를 포함함.
-> 파일 테이블 : 커널에서 모든 열려진 파일들을 관리하는 테이블.
파일 테이블의 항목 엔트리에는 파일의 상태 flags와 현재 파일의 작업 offset과 파일의 vnode 테이블의 위치 정보등을 포함함.
-> vnode 테이블 : inode 정보와 현재 파일의 크기를 포함함.
(셸에서 시작한 프로세스는 1번 프로세스 이자 모든 프로세스의 부모 프로세스인 "init 프로세스" 에서 fork()를 통해 파일 테이블을 복사)
1) 하나의 프로세스에서 같은 파일을 두 번 연 경우
서로 다른 파일 디스크립터 부여 / 서로 다른 파일 오프셋을 유지
(즉, 프로세스에서 파일 입출력은 open 함수로 연 작업을 구분. => 실제 물리적인 파일이 같은지는 구분 하지 않는다. / but, 같은 v-node를 참조)
2) 두 개의 프로세스에서 같은 파일을 연 경우
root@ibof-Z10PE-D16-WS:~# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 15080
max locked memory (kbytes, -l) 16384
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 15080
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
#include <stdio.h>
#include <stdio.h>
#include <stdio.h> // printf()
#include <string.h> // strlen()
#include <fcntl.h> // O_WRONLY
#include <unistd.h> // write(), close()
#include <sys/types.h>
int main(void)
{
for(int i=0; i< 1026; ++i)
{
int fd = open("./hello.txt",O_RDONLY);
printf("%d\n", fd);
if (fd == -1)
{
printf("error\n");
}
}
}
sudo ls -trn /proc/[PID]/fd
'Operating System' 카테고리의 다른 글
[운영체제] Chapter 3. 프로세스 (0) | 2021.01.10 |
---|---|
[커널] Block I/O Layer (0) | 2020.05.27 |
[파일시스템] EXT파일시스템 (0) | 2020.05.26 |
[파일시스템] EXT3 파일시스템 (0) | 2020.05.26 |
[파일시스템] EXT2 파일시스템 (2/2) (0) | 2020.05.26 |