write 시스템 호출
#include <unistd.h>
ssize_t write(int filedes, const void *buffer, size_t n);
write 시스템 호출은 read 시스템 호출의 반대이다.
이는 내 프로그램 내의 버퍼의 내용을 외부 파일로 복사한다.
첫 번째 인수는 파일 기술자이다.
두 번째 인수는 쓰여질 내용에 대한 포인터이다.
세 번째 인수는 쓰여질 바이트의 수이다.
반환되는 값은 write에 의해 쓰여진 문자의 수 또는 오류 발생시 -1이 있다.
int fd;
ssize_t w1, w2;
char wbuf1[512], wbuf2[1024];
.
.
if( (fd = open("myfile", O_WRONLY | O_CREAT | O_EXCL, 0644)) == -1 )
return (-1);
w1 = write(fd, wbuf1, 512);
w2 = write(fd, wbuf2, 1024);
myfile에 wbuf의 내용과 wbuf2의 내용을 연달아 적는다.
위의 open flags들은 '쓰기 전용으로 오픈하되, 파일이 존재하지 않으면 생성하고, 존재한다면 -1을 반환하라' 이다.
만약 O_EXCL을 제외한다면, 파일이 존재하면 그냥 쓰기 전용으로 오픈이 될텐데, 이렇게 오픈하고나서 write 시스템 호출을 하면?!
파일 포인터가 맨 앞에 위치하여 기존 파일의 내용이 처음부터 덮어써지게 될 것이다.
이 경우를 방지하고, 존재할 경우 파일 포인터를 맨 뒤에 위치하도록 해서 열고 싶다면 O_APPEND flag를 이용하면 되겠군!!
☞ read와 write 시스템 호출을 이용하여 파일 복사하기!
..
...
while( (nread = read(infile, buf, BUFSIZ)) > 0 ) {
while( write(outfile, buf, nread) < nread ) {
close(infile);
close(outfile);
return (-1);
}
}
.,,,
첫 번째 while문은 infle을 BUFSIZ만큼 읽어서 파일 끝까지 읽도록 반복한다.
두 번째 while문은 한 번 읽을 때마다 outfile에 읽은 만큼 write하라는 말이다.
여기서.. 만약 infile을 끝까지 read했다면 0을 반환한다. 그럼 첫 번째 while을 벗어난다.
그렇지 않다면 두 번째 while문으로 간다.
write는 쓰여진 바이트 수를 반환하는데, 정상적으로 쓰여졌다면 nread와 거의 항상 같을 것이다. <- 계속 반복하게 만드는 것
하지만 오류가 발생했거나, 잘못된 경우 nread보다 작은 값을 반환하면, 다 쓰여졌다는 것을 의미하는 조건이 참이 되어 파일을 close한다.
'개발 > System' 카테고리의 다른 글
UNIX 파일 접근 프리미티브 : 파일 제거 (0) | 2012.10.28 |
---|---|
UNIX 파일 접근 프리미티브 : lseek 시스템 호출 (0) | 2012.10.28 |
UNIX 파일 접근 프리미티브 : read 시스템 호출 (0) | 2012.10.28 |
UNIX 파일 접근 프리미티브 : close 시스템 호출 (0) | 2012.10.28 |
UNIX 파일 접근 프리미티브 : open 시스템 호출 (0) | 2012.10.28 |