개발 · 컴퓨터공학 / / 2021. 9. 17. 19:12

UNIX system call - close, read

728x90
반응형

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으로 업데이트 된다. 

728x90
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유