반응형
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 :
반응형
'C언어 header > unistd.h' 카테고리의 다른 글
sleep(3) - 설정된 초(second) 동안 대기 (0) | 2019.10.01 |
---|---|
readlink(2) - symbolic link 값을 읽는 함수 (0) | 2019.10.01 |
pread(2) - 지정된 위치에서 파일 읽기 (0) | 2019.10.01 |
lstat(2) - symbolic link의 상태 및 정보를 얻는 함수 (0) | 2019.10.01 |
lseek(2) - file의 읽기/쓰기위한 위치 변경 (0) | 2019.10.01 |