read 시스템 호출


#include <unistd.h>


ssize_t read(int filedes, void *buffer, size_t n);


read 시스템 호출은 파일 안에 있는 문자나 바이트를 내 프로그램 안의 버퍼로 복사하기 위해 사용된다.

버퍼는 void형이므로, 어느 타입의 데이터라도 저장할 수 있다.


첫 번째 인수 filedes는 이전의 open이나 creat 호출로부터 얻은 파일 기술자이다.

두 번째 인수는 자료가 복사될 문자 배열에 대한 포인터이다.

세 번째 인수는 파일로부터 읽혀질 바이트의 수를 나타내는 양의 정수이다.

read 시스템 호출은 실제로 읽힌 바이트수는 반환한다.

보통 세 번째 인수의 값인 요청된 문자의 수이지만, 항상 그런 것은 아니고, 더 작은 값을 가질 수 있다.

또한 오류가 발생하면 -1을 반환한다.


int fd;

ssize_t nread;

char buffer[SOMEVALUE];


// open을 통하여 fd를 얻었음

.

.

nread = read(fd, buffer, SOMEVALUE);



☞ 읽기-쓰기 포인터 (파일 포인터)에 대하여 알아보자.

시스템은 읽기-쓰기 포인터 또는 파일 포인터라 불리는 것을 사용하여 파일 안에서의 프로세스의 위치를 관리한다.


만약 myfile이 최소한 1024개의 문자를 가지고 있다고 가정하자.

아래의 프로그램은 myfile의 처음 512 문자들을 buf1에 저장하고, 두 번째 512 문자들을 buf2에 저장한다.


int fd;

ssize_t n1, n2;

char buf1[512], buf2[512];

.

.

.

if( (fd = open("myfile", O_RDONLY)) == -1 )

return (-1);


n1 = read(fd, buf1, 512);

n2 = read(fd, buf2, 512);


read의 경우, 시스템은 각 호출 후에 읽혀진 바이트 수만큼 파일 포인터를 전진시킨다.

파일 오픈 후 파일 포인터가 맨 처음에 위치하게 되는데, n1 = read(...); 를 수행한 후에는 파일 포인터가 512 다음에 위치하게 되고, n2 = read(...)를 수행한 후에는 그 위치에서 512를 더한만큼의 위치에 파일 포인터가 있을 것이다.


그렇다면, 내가 읽으려고 하는 파일의 크기를 모를 때 다 읽었는지 어떻게 알 수 있을까?

이 때에는, read의 반환 값을 이용하여 알 수 있다!

read 호출에 의해 요청된 문자의 수 > 파일에 남아 있는 문자의 수

↑ 이 경우 버퍼에는 파일 안에 남아 있는 문자들만 전달하고, 반환되는 값은 요청된 문자의 수만큼 읽지 못했으니 요청된 문자의 수가 아니라 바로 0이다.

즉, 반환된 값이 0이라면 더 읽을 수 있는 남아있는 문자가 하나도 없다는 말이다!


.

.

.

while( (nread = read(fd, buf, BUFSIZ)) > 0 )

total += nread;

.

.

.


위와 같은 방법으로 파일을 BUFSIZ만큼 읽어가면서 파일 내 문자 수를 셀 수가 있다.

+ Recent posts