상세 컨텐츠

본문 제목

UNIX system call - write

Computer Science/UNIX

by 2021. 9. 18. 19:37

본문

반응형

write(2)

#include <unistd.h>

ssize_t write(int filedes, const void *buffer, size_t n);
// Returns : number of bytes written if OK, -1 on error

read에서는 buffer안에 데이터를 복사하여 저장하였지만, write에서는 거꾸로 buffer memory에서 filedescription이 가리키는 file로 정보를 복사하여 저장한다.

write는 buffer에서 file로 저장된 byte 크기만큼을 반환한다. 

 memory에서 파일로 byte를 복사하여 저장하면, 현재 파일 position(file offset)에서부터 n byte만큼(복사한 만큼) file poisition(file offset)이 이동한다.

 

만약 기존에 존재하는 파일에 write를 하는 거라면

기존 데이터를 유지한 상태로 overwritten(덮어쓰기)한다.

 

O_APPEND 옵션으로 파일을 open하였을 경우에는, file offset(file poisition)이 현재 파일의 EOF로 세팅되므로, write하게되면 파일의 마지막에 추가하게 된다.

 

예제 코드를 보자

int copyfile ( const char *name1, const char *name2){
    int infile, outfile;
    ssize_t nread;
    char buffer[BUFSIZE];	/* BUFSIZE : 512 */

    if ( (infile = open (name1, O_RDONLY ) )== -1)
	return(-1);

    /* FMODE : O_WRONLY|O_CREAT|O_TRUNC */
    // 파일이 있으면 truncate이므로 파일을 비우고 open, 없으면 해당 PERM(permission)으로 생성한다.
    if ( (outfile = open (name2, FMODE, PERM) )== -1){
        close (infile);
        return (-2);
    }
    
    while ( (nread = read (infile, buffer, BUFSIZE) ) > 0){ // 읽은 byte수가 nread에 저장
        if ( write(outfile, buffer, nread) < nread ){ // nread만큼 write하나 
	   close (infile); 		//nread보다 write가 반환한 값이 작으면 오류
	   close (outfile);
	   return (-3); 		/* 쓰기 오류 */
        }
    }

    close (infile);
    close (outfile);

    if ( nread == -1)  return (-4)	/* 마지막 읽기에서 오류 발생 */
    else   return (0); 		/* 만사가 잘 되었음*/
}

while문에서 file을 EOF까지 읽은 경우 nread값으로 0이 반환되므로 반복문이 끝나고, nread값 만큼 write만 값이 nread와 일치하면 계속 복사를 진행하고, write의 반환 값이 nread보다 작은 경우에는 write에서 오류가 생긴 것이므로 return 한다. 

 

read, write의 효율성에 대한 표를 보자
BUFSIZE Real time User time System time
1 0:24.49
0:3.13
0:21.16
64
0:0.46
0:0.12
0:0.33
512 (1/2K)
0:0.12
0:0.02
0:0.08
4096 (4K)
0:0.07
0:0.00
0:0.05
8192 (8K) 0:0.07 0:0.01 0:0.05

user time은 실제로 프로세스가 실행한 시간, system time은 os만 실행한 시간, real time은 os를 포함한 다른 프로세스를 감안하여 실행한 시간을 의미한다. 

결과를 보면 4K(4096byte)일 때가 효율이 가장 좋다.

system call은 상당히 부하가 심한 작업이므로 buffer size가 작아 read, write의 system call 사용횟수가 증가하면 그만큼 효율이 떨어진다는 것을 알 수 있다.

반응형

'Computer Science > UNIX' 카테고리의 다른 글

UNIX - File Share  (0) 2021.09.20
UNIX system call - lseek  (0) 2021.09.19
UNIX system call - close, read  (0) 2021.09.17
UNIX system call - create  (0) 2021.09.16
UNIX - File permissions 파일 권한  (0) 2021.09.15

관련글 더보기