CS(Computer Science)/UNIX

[UNIX] read() write() 시스템 콜의 사용법과 주의사항

seongmik 2023. 2. 5. 16:17
728x90
반응형

UNIX file 접근의 기초

read/write 시스템 콜에 대해 설명하기 전에 먼저 UNIX file 접근의 기초에 대해서 이해해 보자.

 

UNIX상의 모든 file은 byte들의 linear sequence이다.

이 말은 즉, Text file과 Binary file이 따로 나누어져 있지 않다는 의미이다.

모든 파일은 Binary file이다.

 

UNIX에서는 이런 파일들을 프로세스상에서 구분하기 위해서 open 해놓은 파일에 대해서 file descriptor라는 파일 구분자를 운영한다.

이는 file을 open 할 때마다 구조체 배열에 파일의 메타데이터가 저장되는 식으로 작동된다.

참고로 open 시스템 콜을 사용해서 file을 open 하게 되면 가공되지 않은 binary code를 그대로 받게 된다.

 

표준 입출력에 사용되는 file descriptor는 따로 정의되어 있는데 이는 다음과 같다.

0 : 표준 입력

1 : 표준 출력 

2 : 표준 오류 출력

 


read 시스템 콜

이제 file descriptor에 대해 이해했으니 read 시스템 콜에 대해 살펴보자.

#include <unistd.h>

ssize_t read(int filedes, void *buffer, size_t nbytes);

각각의 인수는 다음과 같다.

filedes : open 된 file의 file descriptor

*buffer : 읽은 data를 저장할 곳의 주소 (data type은 상관없다)

nbytes : 읽을 byte 수 (data type에 상관없이 지정된 byte 수만큼 읽는다.)

return 값 : 성공 시, 실제 읽힌 byte 수

                  실패 시, -1

 

read 함수를 글로 설명하면 다음과 같다.

open 된 file로부터 지정한 byte 수만큼의 data를 읽어서 지정된 저장장소에 저장하는 명령.

read 함수의 주의할 점은 read 함수는 읽을 데이터가 없다고 실패라고 판단하지 않는다.

읽을 데이터가 없다면 read함수는 0을 return 한다.

즉, 0을 리턴 받았으면 다 읽었다는 의미이다.

 


write 시스템 콜

#include <unistd.h>

ssize_t write(int filedes, const void *buffer, size_t nbytes);

각각의 인수는 다음과 같다.

filedes : write를 할 file의 descriptor

*buffer : write 할 내용이 들어 있는 저장 장소의 주소

nbytes : wirte 할 byte 수

return 값 : 쓰인 byte 수 or -1

여기서 return 값에 대해 살펴보자.

보통은 write함수는 쓰여진 byte의 수를 리턴한다. 즉 return값이 n이다.

하지만 return 값이 nbytes의 n보다 작다면, 쓰는 도중에 file이 가득 찼다는 것을 의미한다.

만약, 쓰기 전에 꽉 차게 된다면 -1을 return 하게 된다.

이점이 read와 write의 차이이다.

 


read와 write의 효율성

read와 write를 이용해서 file을 복사하는 프로그램은 어떨 때 효율적일까?

1. buffer의 size가 512(disk blocking factor)의 배수일 때, 효율적이다.

2. 시스템 콜의 수가 적을수록 효율적이다.

 

read/write는 data를 읽을 때, 한 블록씩 읽는다. 따라서 읽을 블록의 수가 많을수록 시간이 오래 걸린다.

또한 시스템 콜이 호출될 때마다 OS를 호출해서 context switching이 발생하게 되는데, context switching이 오래 걸리기 때문에 시스템 콜을 적게 사용할수록 효율적이다.

728x90
반응형

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

UNIX - [Record Locking]  (0) 2023.01.03
UNIX - [Shared memory]  (0) 2023.01.02
UNIX - [Semaphore]  (0) 2023.01.01
UNIX - [시스템 V의 프로세스간 통신 - Message queue]  (0) 2023.01.01
UNIX - [PIPE - 2]  (0) 2022.12.31