유닉스에서 파일을 읽고 쓰는 방법은 low-level 파일과 high-level 파일 입출력으로 구분할 수 있다.

 

이번 포스팅에서는 low-level 파일 입출력에 대해서 볼 것이다.

 

저수준 파일 입출력

  • 유닉스 커널의 시스템 호출을 사용하여 파일 입출력을 수행한다.

  • 시스템 호출을 이용하기 때문에 좀더 빠르게 파일에 접근 가능하다.

  • 바이트단위로 파일의 내용을 다루므로 특수 파일도 읽고 쓸 수 있다.

  • 바이트단위로 입출력을 수행하기때문에 응용 프로그램 작성시 변환 함수등의 추가 기능을 구현해야한다.

  • 열린 파일을 참조하는데에 파일 기술자(file descriptor)를 사용한다.

  • 파일 지시자 : int fd

 

1. 파일 디스크립터(File Descriptor)

- 현재 프로세스에서 열려있는 파일을 구분할 목적으로 유닉스가 붙여놓은 번호이다. 저수준 파일 입출력에서 열린 파일을 참조하는데 사용하는 기술자 역할을 한다. 정수값(int)이며, open함수를 사용해 파일을 열었을 때 반환된다.

 

- 프로세스에서 열린 파일의 목록을 관리하는 테이블의 인덱스???

 

0 : 표준 입력

1 : 표준 출력 

2 : 표준 오류 출력

 

프로세스가 처음 동작할 때 0, 1, 2는 기본으로 할당이 되며

프로세스가 파일을 처음 열면 3번 기술자 할당된다.

 

FD(File Descriptor)

한 프로세스에서 특정파일 혹은 소켓에 접근할 때 사용하기위해 부여된 정수

 

 

 

2. 파일 열고 닫기(open(), close())

 

1) 파일 열기: open(2)

프로토타입

int open(const char *path, int oflag [, mode_t mode]);

 

- path : 열려는 파일이 있는 경로

 

- oflag : 파일 상태 플래그. 플래그를 OR(|)연산자로 연결해 지정할 수 있다.     

 

- mode : 접근 권한(O_CREAT플래그를 지정해 파일을 생성할 때만 사용한다. 파일 권한을 설정하듯이 지정할 수 있으나 <sys/stat.h>에 정의된 플래그를 사용할 수 있다.

 

oflag와 mode에 대한 자세한 설명 링크

- www.joinc.co.kr/w/man/2/open

- m.blog.naver.com/PostView.nhn?blogId=bestheroz&logNo=113881732&proxyReferer=https:%2F%2Fwww.google.com%2F

 

 

 

open은 시스템호출로 파일을 열거나 생성 할때 사용한다.

성공 : 해당파일을 지시하는 int형의 파일식별자(파일디스크립터)를 반환해준다.

실패 : -1 및 외부변수 errno에 실패사유 코드 저장한다. perror()로 출력하면 메세지 확인 가능.

 

 

 

2) 파일 닫기 : close(2)

 

파일을 닫는데 사용하며 파일 입출력 작업이 끝나면 반드시 닫아야한다.

한 프로세스가 열 수 있는 파일의 개수에 제한이 있기 때문이다.

파라미터로 파일 기술자를 넘겨줘야한다.
성공적으로 닫으면 0을 리턴하고 실패하면 -1과 오류코드를 errno에 저장한다.

 

 

 

 

3. 파일 읽고 쓰기(read(), write())

 

1) 파일 읽기 : read(2)

- 프로토 타입

ssize_t read(int fd, void *buf, size_t bytes);

인자 설명

- fd : 파일기술자

- buf : 바이트를 저장할 메모리 영역의 시작 주소

- nbytes : 읽어올 바이트수

 

이 함수는 파일 기술자가 가리키는 파일에서 지정한 크기만큼 바이트를 읽어서 buf로 지정한 메모리 영역에 저장한다. 리턴값이 0이면 더이상 읽을 내용이 없다는 의미이다.

파일을 열면 읽어올 위치를 나타내는 오프셋이 파일의 시작을 가리키지만, read함수를 실행할 때마다 읽어온 크기만큼 오프셋이 이동해 다음 읽어올 위치를 가리킨다.

무조건 바이트 단위로 읽는다.

 

 

 

2) 파일 쓰기 : write(2)

write함수는 read함수와 인자의 구조는 같지만 뜻이 틀리다. 파일 기술자는 쓰기를 수행할 파일을 가리키고, buf는 파일에 기록할 데이터를 저장하고 있는 메모리 영역을 가리킨다.

buf가 가리키는 메모리 영역에서 nbytes로 지정한 크기만큼 읽어 파일에 쓰기를 수행한다.

write 함수도 실제로 쓰기를 수행한 바이트 수를 리턴하며 오류가 발생하면 -1을 리턴한다.

반응형

'42seoul > get_next_line' 카테고리의 다른 글

[get_next_line] 지역변수, 전역변수, 정적변수  (0) 2020.11.23

+ Recent posts