반응형
pread(2)
#include <unistd.h>
ssize_t pread(int fd, void *buf, size_t count, off_t offset);
파일의 offset 위치에서 count byte만큼의 파일을 읽어서 buf에 저장합니다. 이 함수는 read(2)함수와 달리 파일을 읽더라도 파일의 읽기/쓰기 offset 위치를 이동시키지 않습니다. 이 함수는 multi-thread 환경에서 같은 파일을 여러 thread가 동시에 호출하더라도 offset 위치에서부터 읽기 때문에 다른 thread의 영향을 받지 않는 장점이 있습니다.
파라미터
fd
- open(2) 또는 creat(2) 등을 통하여 생성된 file descriptor
- socket, pipe 등과 같이 읽을 위치를 이동할 수 없는 fd에서는 사용할 수 없습니다.
buf
- 읽은 데이터를 저장할 buffer 공간
count
- 읽을 데이터 byte 수
offset
- 읽을 파일의 시작 위치
RETURN
0 이상
- 실제로 읽은 데이터의 byte 수.
- 데이터를 읽는 도중에 end of file에 도달했다면, count보다 적을 수 있습니다.
0
- count값을 0으로 설정하여 읽은 경우나, end of file에 도달하여 읽을 데이터 없는 경우
-1
-오류가 발생하였으며, 상세 오류 내용은 errno에 설정됩니다.
- 오류 내용은 read(2)와 lseek(2)에서 발생할 수 있는 오류들이 발생할 수 있습니다.
EAGAIN : file을 open할 때에 O_NONBLOCK flag이 설정되었으며,
현재 읽을 데이터가 없어서 read()함수를 바로 return함.
EAGAIN or EWOULDBLOCK : fd가 socket이고 socket에 O_NONBLOCK으로 설정된 경우
읽을 데이터를 수신하지 못하여 바로 return함.
EBADF : fd가 유효하지 않은 file descriptor임.
EFAULT : buf가 access할 수 없는 영역의 데이터 buffer임.
주로 변수를 pointer로 설정한 후에 malloc(3)하지 않은 경우
EINTR : signal이 발생하여 interrupt됨.
EINVAL : fd, buf, count, offset 등의 변수가 잘못 설정된 경우.
(예, count나 offset가 -값으로 설정된 경우 등)
EIO : I/O 오류. background process에서 terminal에 대한 I/O를 시도했다든 지...
EISDIR : open된 fd가 directory인 경우
EOVERFLOW : offset의 값이 off_t type을 벗어난 값입니다.
ESPIPE : fd가 pipe, socket, FIFO입니다.
활용 예제
Sample
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <errno.h>
int main(int argc, char *argv[])
{
int fd;
int size;
char buffer[4096];
if((fd = open("sample2.txt", O_RDONLY)) == -1) {
fprintf(stderr, "ERROR: %s\n", strerror(errno));
return 1;
}
/*
* 파일의 처음부터 1024 바이트를 읽습니다.
*/
if((size = pread(fd, buffer, 1024, 0)) == -1) {
fprintf(stderr, "ERROR: %s\n", strerror(errno));
return 1;
}
close(fd);
return 0;
}
see also :
반응형
'C언어 header > unistd.h' 카테고리의 다른 글
readlink(2) - symbolic link 값을 읽는 함수 (0) | 2019.10.01 |
---|---|
pwrite(2) - 지정된 위치에 파일 쓰기 (0) | 2019.10.01 |
lstat(2) - symbolic link의 상태 및 정보를 얻는 함수 (0) | 2019.10.01 |
lseek(2) - file의 읽기/쓰기위한 위치 변경 (0) | 2019.10.01 |
link(2) - hard link 생성 (0) | 2019.10.01 |