HW & SW Interface/System Programming

5. File I/O - system calls(1)

yeommm 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