Low-level vs High-level file IO
- Low-Level File IO (System call)
- System call을 이용해서 파일 입출력 수행
- File descriptor 사용
- Byte 단위로 디스크에 입출력
- 특수 파일에 대한 입출력 가능
- High-Level File IO (Buffered IO)
- C Standard library를 사용해서 파일 입출력 수행
- File pointer 사용
- 버퍼(block) 단위로 디스크에 입출력
- 여러 형식의 입출력 지원
Opening files - open(2)
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags [, mode_t mode]);
-
pathname
(file path)- 열려는 파일의 경로 (파일 이름 포함)
-
flags
(file state flags. Man page 및 참조)- 파일을 여는 방법(access mode) 설정
- 여러 플래그 조합 가능 (OR bit operation ( | ) 사용)
-
mode
(file access permission. Man page 및 참조)- 파일을 새로 생성(O_CREATE) 할 때만 유효
- 파일 권한 설정 값 사용 (예, 644)
- 정의 된 플래그 사용
- 여러 플래그 조합 가능 (OR bit operation ( | ) 사용)
- return: file descriptor
File descriptor
- 열려 있는 파일을 구문하는 정수(integer) 값
- 특수 파일 등 대부분의 파일을 지칭 가능
- Process별로 kernel이 관리
- 파일을 열 때 순차적으로 할당 됨
- Process 당 최대 fd 수 = 1,024 (default, 변경 가능)
- Default fds (수정 가능)
- 0: stdin
- 1: stdout
- 2: stderr
File table
- 열린 파일을 관리하는 표
- Kernel이 process별로 유지
- 열린 파일에 대한 각종 정보 관리
- Access mode, file offset, pointer to files
Closing Files - close(2)
#include <unistd.h>
int close(int fd);
-
fd
(file descriptor)- 닫으려는 file descriptor
- return
- 0: success
- -1: error
실습
파일 열고 닫기
#include <sys/types,h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
int fd;
mode_t mode;
mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; // 644
fd = open("hello.txt", O_CREAT, mode);
if (fd == -1)
{
perror("Creat");
exit(1);
}
close(fd);
return (0);
}
Top comments (0)