저수준 파일 입출력
- 파일 지시자는 파일 기술자 (file descriptor), int type
- 유닉스 커널의 시스템 호출을 사용해 파일 입출력 실행함
- 파일에 빠르게 접근 가능, 특수 파일도 읽고 쓸 수 있음 (바이트 단위로 파일 내용 다뤄서)
- 바이트 단위를 적당한 형태의 데이터로 변환하는 함수가 필요함
- open, close, read, write, lseek, dup, dup2, fcntl, fsync
고수준 파일 입출력
- 파일 지시자는 파일 포인터 (file pointer)
- C언어의 표준 함수로 제공, 여러 형태의 데이터 형식 지원함
- 버퍼 단위로 읽고 쓰기 가능
- fopen, fclose, fread, fwrite, fputs, fgets, fprintf, fscanf, fseek
파일 기술자 (file descriptor)
- 현재 열려있는 파일 구분하는 정수값
- 0 : 표준 입력 1 : 표준 출력 2 : 표준 오류
파일 열기 - open
path에 지정한 파일을 oflag에 지정한 플래그 값에 따라 열고 파일 기술자 리턴
mode에 파일 접근 권한을 지정 (0644처럼 숫자나 플래그 값)
#include <sys/types.h>
#incldue <sys/stat.h>
#include <fcntl.h>
int open(const char *path, int oflag[,mode_t mode]);
oflag 값
- O_RDONLY : 읽기 전용
- O_WRONY : 쓰기 전용
- O_RDWR|CREAT : 읽기, 쓰기 가능
- O_EXCL|O_CREAT : 기존에 없는 파일이면 생성, 있으면 오류 메시지 출력
- O_APPEND : 파일 맨 끝에 내용 추가
- O_TRUNC|O_CREAT : 파일 생성할 때 이미 존재, 쓰기 옵션으로 열었으면 내용 모두 지우고 파일 길이 0으로 변경
- O_NONBLOCK/O_NDELAY : 비블로킹(Non-blocking) 입출력
- O_SYNC/O_SYNC : 저장장치에 쓰기 끝나야 쓰기 동작 완료함 (동기화 시키려는 flag)
mode
- flag : S_IRWXU / 모드 : 0700 - 소유자 읽기 / 쓰기 / 실행 권한
X : 실행 / RW : read, write / U : user - flag : S_IRWXG / 모드 : 0070 - 그룹 읽기/쓰기/실행 권한
G : 그룹 - flag : S_IRWXO / 모드 : 0007 - 기타 사용자 읽기/쓰기/실행 권한
O : other user - 거의 0644 씀
- 06 : 유저 읽기쓰기 가능, 4 : 유저와 같은 그룹은 읽기 가능, 4 : 기타 사용자는 읽기 가능
- 소스파일 실행 권한은 없음
파일 닫기 - close
프로세스에서 열 수 있는 파일 개수는 제한되어 있음 -> 사용 끝나면 닫아야 함
#include <unistd.h>
int close(int fildes);
새 파일 열고 닫기
mode 접근 권한 : 0644
mode 대신 숫자 0644 넣어도 됨
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main(){
int fd;
mode_t mode;
mode = S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH;
fd = open("unix.txt", O_CREAT, mode);
if(fd == -1){
perror("Creat");
exit(1);
}
close(fd);
return 0;
}
파일 읽기 - read
#include <unistd.h>
ssize_t read(int fildes, void *buf, size_t nbytes);
- 파일에서 nbytes로 지정한 크기만큼 바이트 읽어서 buf에 저장
- 실제로 읽어온 바이트 개수 리턴
- 리턴값 0이면 파일의 끝에 도달함 의미
- 무조건 바이트 단위로 읽어옴
파일 쓰기 - write
#include <unistd.h>
ssize_t write(int fildes, const void *buf, size_t nbytes);
- buf가 가리키는 메모리에서 nbytes로 지정한 크기만큼 파일에 기록
- 실제로 쓰기 수행한 바이트 수 리턴
- 키보드로 입력하면 절대 안됨
파일 읽고 쓰기
rdf 6바이트씩 읽어서 wdf에 6바이트씩 붙여넣기
int main(void) {
int rfd, wfd, n;
char buf[10];
rfd = open("unix.txt", O_RDONLY);
if(rfd == -1) {
perror("Open unix.txt");
exit(1);
}
wfd = open("unix.bak", O_CREAT | O_WRONLY | O_TRUNC, 0644);
if (wfd == -1) {
perror("Open unix.bak");
exit(1);
}
while ((n = read(rfd, buf, 6)) > 0)
if (write(wfd, buf, n) != n) perror("Write");
if (n == -1) perror("Read");
close(rfd);
close(wfd);
return 0;
}
- od -d testdata : byte를 int형으로 보기 가능