Notice
Recent Posts
Recent Comments
Link
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Tags
more
Archives
Today
Total
관리 메뉴

개발블로그

Unix File I/O 본문

카테고리 없음

Unix File I/O

학교옆메추리 2020. 5. 29. 16:35

Unbuffered I/O - 커널에 의한 시스템콜로 호출된 각각의 read와 write

Buffered I/O - Standard I/O

 

File Descriptors

모든 오픈된 파일은 file descriptor에 의해 참조된다.

커널은 파일을 생성하거나 열면 fd를 반환한다.

unix default fd - 0: statndard input / 1: standard output / 2: standard error

 

open()

pathname, oflag, mode를 인자로 받아 파일을 열고, fd를 반환한다.

이 때, 사용중이지 않은 가장 낮은 번호의 descriptor를 반환한다.

Oflag

required: O_RDONLY(읽기), O_WRONLY(쓰기), O_RDWR(읽고쓰기)

optional: O_APPEND(파일 끝에 쓰기), O_CREAT(path에 존재하지 않는 파일이면 생성), O_EXCL(atomic opetation. O_CREATE와 같지만, 파일이 이미 있다면 에러를 반환)

 

create()

새 파일이 쓰기모드로 오픈된다.

 

close()

파일을 닫는다. (프로세스가 종료되면, 모든 파일은 자동으로 닫힘)

 

lseek(fd, offset, SEEK_SET | SEEK_CUR | SEEK_END)

file offset을 설정 및 반환하는 함수. 여기서 offset이란 read, write가 수행되는 위치를 말한다.

lseek로 커서 위치를 변경했다고 I/O에 영향을 미치지 않는다.

pipe, FIFO는 파일이 아니라 stream형식이기 때문에 lseek를 수행할 수 없다.

file offset은 파일의 사이즈보다 커질 수 있다. 그 상태에서 write하면 파일 크기가 확장되며 파일에 hole(빈 공간)이 생긴다.

hole

file.hole에 0~10, 16384~16394에만 데이터가 있다고 해보자(11~16383은 hole).

ls -ls로 출력해보면 8개의 데이터 블록이 할당되어 있다.(블록은 한번에 4개, 4096btye씩 해주므로)

하지만, cat file.hole > file.nohole 명령을 통해 복사하게 되면, hole이 null로 채워져 쓰여지기 때문에, 20블록(16394 / 1024 ~= 16.xx)이 할당된다.

 

read(fd, buf, nbytes)

EOF(end of file)을 만날 때까지 파일을 읽는다. 

wirte(fd, buf, nbytes)

디스크가 꽉차거나 file size limit을 넘어가면 쓰기가 실패할 수 있다.

 

 

FIle Sharing in UNIX

커널의 데이터 구조는 프로세스에 의해 공유된다.

process table entry에 file descriptor table이 있다. fd, fd flag, file table entry를 가리키는 포인터를 포함한다.

커널에서 오픈된 파일들에 대해 file table이 존재한다. current file offset, file status flag(읽기 쓰기 등),, v-node table entry를 가리키는 포인터를 가진다.

v-node table은 오픈된 파일에 대한 i-node와 v-node의 정보를 가지고 있다.

i-node: 파일 사이즈, 파일 소유주, 파일이 저장된 디스크 블럭의 주소 등을 가진다.

v-node: file type을 가짐

 

같은 프로세스에서 같은 파일을 여러 번 오픈하면?  file table이 두개 생길 뿐, 어차피 i-node는 하나이기 때문에 상관없다. 

각각의 write가 끝나면, current file offset은 증가하고, 증가한 값이 v-node table에 저장된 current file size보다 크다면, 파일사이즈를 증가한 offset으로 설정한다.