반응형

pwrite(2)

#include <unistd.h>

ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);

파일의 offset 위치에 buf의 내용을 count byte만큼 쓰기를 합니다. 이 함수는 write(2)함수와 달리 파일을 쓰더라도 파일의 읽기/쓰기 offset 위치를 이동시키지 않습니다. 이 함수는 multi-thread 환경에서 같은 파일을 여러 thread가 동시에 호출하더라도 offset 위치에 쓰기 때문에 다른 thread의 영향을 받지 않는 장점이 있습니다.

 

 

파라미터

fd
    - open(2) 또는 creat(2) 등을 통하여 생성된 file descriptor
    - socket, pipe 등과 같이 쓰기 위치를 이동할 수 없는 fd에서는 사용할 수 없습니다.
buf
    - 쓰기 위한 데이터
count
    - 쓸 데이터에 대한 byte 수
offset
    - 쓰기 시작할 파일의 위치

 

RETURN

0 이상
    - 실제로 write된 byte 수.
    - 데이터를 읽는 도중에 end of file에 도달했다면, count보다 적을 수 있습니다.

0
    -  count 파라미터를 0으로 설정한 경우
    
-1
    - 오류가 발생하였으며, 상세 오류 내용은 errno에 설정됩니다. 
    - 오류 내용은 write(2), lseek(2)에서 발생하는 오류와 같은 오류가 발생할 수 있습니다.

 EAGAIN  : file을 open할 때에 O_NONBLOCK flag이 설정되었으며, 쓰기 상태가 block되었을 때
 EAGAIN or EWOULDBLOCK : fd가 socket이고 socket에 O_NONBLOCK으로 설정되었으며, 쓰기가 block되었을 때
 EBADF   :  fd가 유효하지 않은 file descriptor임.
 EDESTADDRREQ : fd가 상대주소가 설정되지 않은 Datagram socket인 경우. 
             즉, connect로 접속된 socket이 아닌경우
 EDQUOT  : 사용자별로 할당된 file system의 disk quot가 찼을 때.
 EFAULT  : buf가 access할 수 없는 영역의 데이터 buffer임. 
             주로 변수를 pointer로 설정한 후에 malloc(3)하지 않은 경우
 EFBIG   : 파일의 크기가 최대 제한보다 크게 write를 하려고 할 때
 EINTR   : signal이 발생하여 interrupt됨.
 EINVAL  : fd, buf, count 등의 변수가 잘못 설정된 경우. (예, count가 -값이 설정된 경우 등)
 EIO : I/O 오류. background process에서 terminal에 대한 I/O를 시도했다든 지...
 ENOSPC  : 저장하려는 공간이 부족한 경우
 EISDIR  : open된 fd가 directory인 경우
 EOVERFLOW : return된 파일 읽기/쓰기 정보가 off_t type을 벗어난 값입니다.
 EPIPE   : pipe 또는 socket에서 상대 reading end가 close된 경우, SIGPIPE signal이 발생하여야 하는 데,
           signal이 ignore하였을 경우 errno에 EPIPE가 설정됨
 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_WRONLY)) == -1) {
        fprintf(stderr, "OPEN ERROR: %s\n", strerror(errno));
        return 1;
    }

    ......

    /*
    * 파일의 시작 위치에 1024 바이트를 읽습니다.
    */

    if((size = pwrite(fd, buffer, 1024, 0)) == -1) {
        fprintf(stderr, "WRITE ERROR: %s\n", strerror(errno));
        close(fd);
        
        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.

,