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만큼 읽어가면서 파일 내 문자 수를 셀 수가 있다.
'개발 > System' 카테고리의 다른 글
UNIX 파일 접근 프리미티브 : 파일 제거 (0) | 2012.10.28 |
---|---|
UNIX 파일 접근 프리미티브 : lseek 시스템 호출 (0) | 2012.10.28 |
UNIX 파일 접근 프리미티브 : write 시스템 호출 (0) | 2012.10.28 |
UNIX 파일 접근 프리미티브 : close 시스템 호출 (0) | 2012.10.28 |
UNIX 파일 접근 프리미티브 : open 시스템 호출 (0) | 2012.10.28 |