1. 파일 개요 & 기본 명령어
File
- 보조 기억 장치에 저장된 연관된 정보들의 집합
- 보조 기억 장치 할당의 최소단위
- 물리적 정의
- File operations
- Create, Write, Read, Reposition, Delete, Etc
- OS는 file operations들에 대한 system call을 제공해야 함
Types of files in Unix/Linux
- Regular file(일반 파일): Text or Binary data file
- Directory: Unix/Linux에서는 directory도 하나의 파일
- Special file(특수 파일): 파일 형태로 표현된 커널 내 객체, 데이터 전송이나 장치 접근 시 사용하는 파일
File acess permission
- 사용자: 소유자(Owner), 그룹(Group), 기타(Others)
- 권한: 읽기(r), 쓰기(w), 실행(x)
Basic commands for file
- ls(list) : 현재 directory 내 파일 목록 출력
- -l : 상세 파일 정보 출력 (long)
- -a : 모든 파일(숨겨진 파일 포함) 목록 출력 (all)
$ ls
$ ls -a
$ ls -al
- touch: 빈 파일 생성 or 파일의 time stamp 변경
- mkdir: 빈 디렉토리 생성
$ touch emptyFile
$ mkdir testDir
- rm(remove): 파일 삭제
- -r : directory 삭제
$ rm emptyFile
$ rm -r testDir
- cat(concatenate) : 파일 내용 출력
$ vi myName
$ cat myName
jimin
- cp(copy) : 파일 복사
- -r : directory 복사
$ cp myName myNameCopy
$ ls
myName myNameCopy
$ cat myNameCopy
jimin
- mv(move) : 파일 이동 or 이름 변경
$ mv myName myNameMove
$ ls
myNameCopy myNameMove
- chmod(change mode): 파일 권한 변경
- 8진수 L: 4, W: 2, X: 1로 222는 소유자, 그룹, 기타 사용자에 www 권한을 준다.
- u + r : user(소유자)에게만 r(읽기) 권한을 준다.
$ chmod 222 permission
$ chmod u+r permission
2. 파일 열기/닫기
Low-Level File IO (System call)
- System call을 이용해서 파일 입출력 수행
- File descriptor 사용
- Byte 단위로 디스크에 입출력
- 특수 파일에 대한 입출력 가능
High-Level File IO (Buffered IO)
- C Standard library를 사용해서 파일 입출력 수행
- File pointer 사용
- 버퍼(block) 단위로 디스크에 입출력: 여러 형식의 입출력 지원
Man Page: 시스템 사용 설명서
$ man [options] [section] page
1: shell
2: system call
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): 파일을 여는 방법(access mode) 설정
- 여러 플래그 조합 가능 (OR bit operation ( | ) 사용)
- ex) O_WRONLY | O_TRUNC, O_RDWR | O_APPEND
종류 | 기능 |
O_RDONLY | 파일을 읽기전용으로 연다. |
O_WRONLY | 파일을 쓰기전용으로 연다. |
O_RDWR | 파일을 읽기와 쓰기가 가능하게 연다. |
O_CREATE | 파일이 없으면 파일을 생성한다. |
O_APPEND | 파일의 맨 끝에 내용을 저장한다. |
- mode(file access permission): 파일을 새로 생성(O_CREATE) 할 때만 유효
- 파일 권한 설정 값 사용
- 정의된 플래그 사용: 조합하여 사용 가능 (OR bit operation ( | ) 사용)
- ex) S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH
- Return: file descriptor
File descriptor
- 열려 있는 파일을 구분하는 정수(integer) 값
- 특수 파일 등 대부분의 파일을 지칭 가능
- Process별로 kernel이 관리
- 파일을 열 때 순차적으로 할당 됨 (Process 당 최대 fd 수 = 1,024)
- Default fds(수정가능) - 0 : stdin, 1 : stdout, 2 : stderr
int openFile(void) {
int fd = open("hello.txt", O_RDWR);
if (fd == -1) {
perror("File Open");
exit(1);
}
return fd;
}
int main(void) {
int fd = 0;
fd = openFile(); printf("fd = %d\n", fd);
close(fd);
close(0);
fd = openFile(); printf("fd = %d\n", fd);
close(fd);
return 0;
}
$ gcc -o allocFD.out allocFD.c
$ ./ allocFD.out
fd = 3
fd = 0
File table
- 열린 파일을 관리하는 표
- Kernel이 process 별로 유지
- 열린 파일에 대한 각종 정보 관리: Acess mode, file offset, pointer to files
Closing files - close(2)
#include <unistd.h>
int close (int fd);
- fd(file descriptor): 닫으려는 file descriptor
- Return - 0 : sucess, 1 : error
Error handling for system call
- System call은 실패 시 -1을 반환
- Error code는 errco에 저장됨
- perror(3) : Error message를 출력해주는 함수
#include <stdio.h>
void perror (const char *str);
Open & Close a file
#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;
}
$ ls hello.txt
ls: cannot access 'hello.txt': No such file or directory
$ vi fileOpenClose.c
$ gcc -o fileOpenClose.out fileOpenClose.c
$ ./fileOpenClose.out
$ ls -l hello.txt
-rw-r--r-- 1 jimin jimin 0 Aug 29 17:24 hello.txt
'Linux' 카테고리의 다른 글
파일 입출력 - 읽기/쓰기, File descriptor (0) | 2021.09.14 |
---|