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 :

    File 속성 정보 및 파일 관리 Library

    Directory 정보 조회 및 관리 Library

    System Call File I/O Library

    Stream File I/O Library

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

댓글을 달아 주세요