리눅스에서의 file i/o에 대한 system call과 c를 이용해서 파일 입출력을 해보겠습니다.
일단 system call이란 application 즉, 사용자가 쉽게 프로그래밍할 수 있도록 만든 언어들 c++ 이런것 들은 하드웨어를 직접 access할 수 없습니다. hardware는 운영체제가 관리를 하기 때문에 하드웨어 접근이 필요할 때 운영체제에게 서비스를 요청할 때 system call을 사용하여 요청한다고 볼 수 있습니다.
리눅스에서의 file i/o에 관한 system call은
open, read, write, close
lseek, fcntl, ioctl 이 있습니다.
#include <unistd.h>를 하게되면
자동적으로
STDIN_FILENO (0)
STDOUT_FILENO(1)
STDERR_FILENO(2)
열리게 됩니다.
리눅스는 기본적으로 파일을 오픈하면 3개가 오픈이 되고 각각 정수 0,1,2의 리턴값을 가집니다.
그래서 파일을 여는 open의 리턴값은 정수이고 3부터 값을 가지게 됩니다.
int open(char *filename, int option, mode)
options에는
O_RDONLY, O_WRONLY, O_RDWR
O_APPEND, O_CREAT, O_EXCL, O_TRUNC, O_NONBLOCK, O_SYNC
이 있고
O_RDONLY : 읽기만
O_WRONLY : 쓰기만 (이때 파일안에 내용이 있으면 싹다 지우고 씀)
O_RDWR : 읽고 쓰고 둘다.
O_APPEND : 쓰는데 내용 뒤에 추가
O_CREAT : 파일을 새로 만듬
O_TRUNC : 파일을 오픈할 때 기존 내용 없애기.
O_CREAT : O_CREAT 옵션과 함께 사용할 경우 기존에 없는 파일이면 파일을 생성하지만, 이미 있으면 파일을 생성하지 않고 오류 메시지를 출력한다.
O_SYNC : 파일에 쓰기 동작을 할 때 보통 버퍼에만 쓰고 나중에 디스크와 같은 저장 장치로 옮겨쓰는데, 이 옵션이 설정되어 있으면 저장 장치에 쓰기를 마쳐야 쓰기 동작을 완료한다. O_SYNC 플래그는 파일의 수정 시각 속성도 수정할 때까지 기다린다. 이 옵션을 설정하면 프로그램의 실행 속도는 느려질 수 있지만 디스크에 확실하게 저장됨을 보장한다.
mode에는 유저에 대한 읽기 쓰기 권한이 들어간다.
예를 들어 0644다 하면 0은 8진수를 나타내고 나머지는 rwx의 권한이다.
그리고 파일 작업이 끝난 후에는
close(int fd)를 통해 파일을 닫아주면된다.
여기서 int fd는 open함수를 이용해서 받은 리턴 값을 전달하는 것이다.
read(int fd, void *buf, size_t nbyte);
write(int fd, void *buf, size_t nbyte);
먼저 read는 파일에 최대 nbyte만큼 버퍼에 담는 것이다.
만약 nbyte보다 적은 량의 byte가 파일에 남아있으면 그 만큼 버퍼에 담는다.
그래서 리턴 값은 읽은 byte 수를 리턴한다. 파일의 끝은 0, 에러는 -1 리턴
write는 파일에 nbyte만큼 buf를 쓰는 것이다. 리턴 값은 쓴 값이지만 이 경우는 항상 값이 nbyte일 것이다.
에러는 -1 리턴
int lseek(int fd, long offset, int whence);
이것은 파일 포인터를 찾는 함수이다.
파일 포인터란 파일을 읽을 때 한 칸씩 파일 포인터가 움직이면서 파일을 읽는다.
이 파일 포인터를 조작할 때 사용한다.
whence는 기준점이고 이 기준점을 기준으로 offset만큼 이동하라는 것이다.
기준점에는 0,1,2가 들어간다.
0 (SEEK_SET)은 파일의 맨 처음
1 (SEEK_CUR)은 파일 포인터의 현재 위치
2 (SEEK_END)는 파일의 맨 끝을 의미 한다.
int creat(char* pathname, mode);
이건 파일을 생성하는 함수로 write-only의 파일의 정수를 반환함. 에러는 -1
open(pathname, O_WRONLY | O_TRUNC | O_CREAT, mode)랑 같은 표현이다.
나머지 fcntl과 ioctl은 read wirte할 때의 옵션을 지정해 주는 건데
fcntl regular files에 대한 ioctl은 special files에 대한 것이다.
regular files이란 우리가 흔히 하는 그 파일이고
리눅스에서는 키보드, 마우스 등 i/o 장치도 파일로 만들어 관리를 하는데 이것을 special files이라고 한다.
'CS > 리눅스(Linux)' 카테고리의 다른 글
Linux(리눅스) vi 편집기 간단 설명 [컴공과고씨] (0) | 2022.09.20 |
---|---|
Linux(리눅스) 컴파일의 전체적 과정 (윈도우와 차이점) [컴공과고씨] (0) | 2022.09.20 |