-
5. File I/O - system calls(1)HW & SW Interface/System Programming 2020. 5. 5. 20:07
# File I/O review
파일 관련 시스템 프로그래밍을 위한 system calls과 library calls의 관련 함수는 다음과 같으며,
이번 포스팅에서는 system calls을 집중적으로 볼 것이다.
System Calls for File descriptor I/O
- open(); close(); creat(); read(); write();
- seek();
- fcntl();
Library Calls for File I/O (File stream)
- fopen(); freopen(); fclose(); fread(); fwrite();
- fgetc(); fgetchar(); fputc(), putchar();
- fseek(); fprintf(); fscanf();
# Linux File System
리눅스 커널은 Process/ File/ Memory/ Device 등 몇 가지 부분으로 모듈화 되어 있으며, 그 중 File System은 가장 중요한 부분이라고 할 수 있다. File System에서 하는 가장 중요한 일은 storage(HDD)에 저장되어 있는 파일에 대한 관리와 파일 관련 인터페이스를 유저에게 제공하는 것(system call)이라 할 수 있다.
리눅스 파일 시스템에서 모든 파일들은 자신만의 inode를 가지고 있다. inode란 파일의 모든 정보를 관리하는(담고 있는) data structure(block 단위로 관리)이다. 파일의 모든 정보라함은 파일명/ 타입/ owner id/ 접근 권한/ 생성 및 수정 시간/ 파일 크기/ data block의 주소 등을 말한다. inode는 파일의 실제 정보가 기록되어 있는 block의 주소를 관리한다. 즉, 리눅스 파일 시스템은 파일의 정보를 inode를 통해 block 단위로 관리한다.
# File Descriptor
File Descriptor는 system calls에서 파일을 지칭하는 정보로 사용되며, 0 이상의 정수 값이다.
파일을 open할 때마다 해당 파일의 file descriptor 값을 반환하기 때문에, 너무 많은 파일이 open될 경우 커널 자원이 한계에 도달한다. 이를 방지하기 위해 한 프로세스에서 open할 수 있는 파일의 수를 1024개로 제한을 둔다.
# File Open
#include <fcntl.h> int open(const char *path, int oflag, mode_t mode);
parameters
- path: 파일 경로(이름)
- oflag: 옵션 -> | 를 이용하여 두 개 이상의 옵션을 붙일 수 있다.
- mode: 접근 권한 ( S_ISUID/ S_ISGID/ S_ISVTX ...)
필수 옵션 의미 O_RDONLY open for read-only O_WRONLY open for write-only O_RDWR open for reading & writing 선택 옵션 의미 O_CREAT 파일 존재하지 않으면 생성 O_EXCL 파일 존재하지 않으면 생성
파일이 존재하면 return error
O_TRUNC 파일 존재하면 내용 삭제 O_APPEND 파일 끝에서부터 쓰기 O_SYNC file I/O를 할 때 동기화 return
- 성공 -> file descriptor
- 실패 -> -1
# File Close
#include <unistd.h> int close(int fd);
return
- 성공 -> 0
- 실패 -> -1
# File Creation
create이 아님에 주의하자!
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int creat(const char *path, mode_t mode);
return
- 성공 -> file descriptor
- 실패 -> -1
# File Seeking
#include <sys/types.h> #include <unistd.h> off_t lseek(int fd, off_t offset, int whence);
parameters
- offset: 옵션에 대한 offset 위치
- whence: 옵션(SEEK_SET/ SEEK_CUR, SEEK_END)
return
- 성공 -> offset 값
- 실패 -> -1
# File Read
#include <unistd.h> ssize_t read(int fd, void *buf, size_t nbyte);
parameters
- buf: 읽을 버퍼 주소
- nbyte: 읽을 바이트 수
return
- 성공 -> 읽은 바이트 수
- 실패 -> -1
# File Write
#include <unistd.h> ssize_t write(int fd, const void *buf, size_t nbyte);
parameters
- buf: 쓸 버퍼 주소
- nbyte: 쓸 바이트 수
return
- 성공 -> 쓴 바이트 수
- 실패 -> -1
'HW & SW Interface > System Programming' 카테고리의 다른 글
4. File I/O - library calls(3) (0) 2020.05.05 3. File I/O - library calls(2) (0) 2020.05.05 2. File I/O - library calls(1) (0) 2020.05.05 1. Introduction (0) 2020.05.04