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한다.

+ Recent posts