close(2)
system call중 close에 대해서 알아보자
#include <unistd.h>
int close(int filedes); // filedes에 file description이 들어간다.
// Returns : 0 if OK, -1 on error
open을 통해서 연 파일을 닫는 system call으로, close를 안하더라도 프로그램이 종료될 때 자동으로 닫힌다.
read(2)
#include <unistd.h>
ssize_t read(int filedes, void *buffer, size_t n);
// Returns : number of bytes read, 0 if end of file, -1 on error
각 매개변수에 대해알아보자.
- filesdes 는 file description
- buffer는 읽어와서 저장할 버퍼이다.
- buffer의 자료형이 void인 것은 타입을 정해놓지 않아 어떤 타입이든 가능하도록 void로 둔 것.
- 시작위치로부터 size_t n만큼 byte를 읽어 buffer에 저장
read의 반환 값으로 실제 읽어온 byte 수가 반환되며, read 실패 시 -1을 반환하고, read의 시작위치가 EOF(End Of File)일 경우 0이 반환된다.
read로 파일을 읽으면, 현재 file position이 메모리에 file offset으로 저장되고, read를 통해 읽는 n byte만큼 update된다.
example
read system call의 예제를 보자
int fd;
ssize_t n1, n2, n3;
char buf1[512], buf2[512], buf3[512];
if( (fd = open(“foo”, O_RDONLY)) == -1)
return -1;
/* f_offset : 0 */ // file position을 의미
n1 = read(fd, buf1, 512); /* n1 : 512, f_offset : 512 */
n2 = read(fd, buf2, 512); /* n2 : 188, f_offset : 700 */
n3 = read(fd, buf3, 512); /* n3 : 0, when read EOF */
위 코드에서 open system call을 read only mode 로 호출 할 때, 해당 이름의 파일이 존재하더라도 파일에 대한 read permission이 없으면 -1을 반환한다.
read를 통해 파일 "foo"에서 512 byte를 읽어와서 buf1에 저장한다.
만약 파일의 크기가 700byte라고 한다면 n1에 read를 통해 읽은 양인 512를 반환한 후, 다시 read를 호출하였을 때 512만큼 읽지 못하고 700-512 = 188만큼을 읽어 buf2에 저장한 후 n2에 188을 반환한다.
세 번째로 read를 통해 512byte를 읽어 buf3에 저장하려고 하면, 이미 f_offset은 EOF에 도달했으므로 읽을 수 있는 데이터가 없고, n3에 0을 반환하게 된다.
위 그림을 보면, File을 가르키고 있는 포인터가 File Table 안에 있고, File Table에 pointing을 하는 것이 File descriptor table이다.
파일을 읽을 때 마다 file table 안의 file offset의 값이 읽은 파일의 position으로 업데이트 된다.
'개발 · 컴퓨터공학' 카테고리의 다른 글
UNIX system call - lseek (0) | 2021.09.19 |
---|---|
UNIX system call - write (0) | 2021.09.18 |
UNIX system call - create (0) | 2021.09.16 |
UNIX - File permissions 파일 권한 (0) | 2021.09.15 |
Real Time Rendering 4th Edition 번역 공부 - Ch.1_1.2 (mathematical notation) (0) | 2021.09.15 |