3-1. File Handling
UNIX File Primitives
- open - 읽기, 쓰기, 생성을 위해 파일을 열기
- create - 빈 파일 생성
- close - 열린 파일 닫기
- read - 파일에서 정보 가져오기
- write - 파일에다 정보 쓰기
- lseek - 읽기/쓰기 포인터의 위치를 이동
- unlink - 파일 삭제 (빈 디렉터리 삭제 불가)
- remove - 파일 삭제 (빈 디렉터리 삭제 가능)
- fcntl - 파일 컨트롤
File Structure
배열에 index 가 있는 것처럼, 파일도 offset 이라는 위치가 있다
원래 파일 내용 뒤에 내용을 추가(appending)할 땐 offset이 EOF이 됨
UNIX File System Model
3가지의 파일 타입이 있다
Regular files - 위 사진과 같이 파일 내용이 바이트들의 배열구조에 저장된다
directory files - 트리 구조(파일끼리의 위계가 존재)
special files - 그 외의 파일들
Device driver and Kernel
디바이스 드라이버 : 실제 장치를 다루는 커널의 일부분
커널은 일반 사용자가 접근할 수 없고, 프로그램이 동작할 때 내부적으로 함수 호출을 사용한다.
커널 영역의 디바이스 드라이버는 System Call 을 인터페이스로 이용함으로써 하드웨어를 제어한다.
Structure of Disk File
- Directory
- file name
- i-node number
- i-node
- 리눅스/유닉스 시스템에서 모든 파일들에 할당되는 고유의 번호
- file속성(owner, rwx, date)
- sector numbers
- Sector
- 실제 데이터가 저장되는 곳
file descriptor
시스템으로부터 할당 받은 파일을 대표하는 0이 아닌 정수 값
프로세스에서 열린 파일의 목록을 관리하는 테이블의 인덱스
- Index 0: stdin
- Index 1: stdout
- Index 2: stderr
프로세스가 실행 중에 파일을 Open 하면
커널은 프로세스의 파일 디스크립터 숫자 중에 사용하지 않는 가장 작은 값을 할당해 준다.
그 다음 프로세스가 열려있는 파일에 시스템 콜을 이용해서 접근할 때, FD 값을 이용해 파일을 지칭한다.
shell redirection
< : 표준입력을 file로
> : 표준출력을 file로
2> : 표준에러를 file로
예시)
$ cat > a.txt
This is a a.txt
를 입력하면 a.txt 파일에 써진다
$ cat sample.txt none.txt 2> res.txt
none.txt 가 없는 파일이라고 한다면, res. txt은 다음과 같다.
none.txt: 그런 파일이나 디렉터리가 없습니다.
filter
| : 먼저 수행된 연산(왼쪽)의 결과가 다음연산(오른쪽)의 입력값으로 연결되는 것
예시)
ls -al | grep "txt"
"txt" 문자열이 포함된 파일만 보여줌
3-2. Files in multi-user environment
System desingn
유저들을 분별할 수 있는가?
유저들이 서로 파일을 공유하게 할 것인가?
다른 시스템에 유저가 접근할 수 있게 할 것인가?
관리자 권한을 줄 것인가?
등등을 고려해야 한다.
User
- Unix : 멀티유저 환경
- user는 uid를 가짐 -> 유저를 식별할 수 있음
- /etc/passwd 는 login name과 uid를 갖고 있다.
Group
- user의 집합
- gid를 가짐.
- 한 유저는 동시에 여러 그룹에 속할 수 있다.
- /etc/group 은 group name과 gid를 갖고 있다.
- /etc/group 파일에서 특정 그룹에 uid가 속하면 유저는 그 그룹에 속한다.
같은 그룹이라고 해서 다른 user의 파일에 맘대로 접근할 수 있는 것은 아니다.
File permissions
Owner : 파일을 소유한 user
Group : 특정 그룹에 소속된 user
Others : 그 외 user
각 3가지 부류에 Read, Write, Execute 권한이 부여된 것을 다음과 같이 확인할 수 있다.
Command: chmod
$ chmod [options] [mode] [file]
파일 접근 권한을 바꾸는 명령어
mode 지정하는 방법 2가지
1. 8진수 사용
$ chmod 755 myfile.c
rwx r-x r-x
- 소유자: 모든 권한
- 그룹 및 그 외 사용자: 읽기, 실행
2. 기호 사용
go+w : 그룹 및 그 외 사용자에게 읽기 권한 부여
System call: open()
int fd = open(const char * path, int oflags, int mode);
oflags가 O_CREAT일 때, 즉 파일을 생성할 때 파일의 mode 를 지정해줄 수 있다.
이것도 2가지 방법으로 mode를 지정해줄 수 있다.
1. 직접 octal(8진수)를 mode에 쓰는 방법
0644 -> (110 100 100) -> rw- r-- r--
2. <sys/stat.h> 에 있는 허가 상수 사용
Super-user, effective id
super-user는 root를 뜻한다.
파일에 대한 모든 권한을 가진다.
$su: 사용자를 변경할 때 쓰는 명령어
su - root 또는 su -
: super user로 전환
su -[username]
: 일반 사용자로 활동
Link
- 하드 링크
- 선택한 파일의 사본 역할
- 원본 파일이 삭제되더라도 하드 링크에는 여전히 해당 파일의 데이터가 포함되어 있다.
- 원본 파일과 동일한 inode 번호를 가진다.
- 소프트 링크
- 파일 이름에 대한 포인터(참조) 역할을 합니다.
- 원본 파일/디렉터리가 삭제되거나 이동할 경우 소프트 링크는 더이상 존재하지 않는 파일/디렉터리를 가리키게 되어 동작하지 않게 됩니다.
- 원본 파일/디렉터리와는 다른 inode 번호를 가진다.
symbolic link
링크를 가리키는 링크
소프트 링크에 속한다
symlinked는 mine.c를 가리키고 있고, mine.c는 i-node #1256를 가리키는 링크이기 때문에
symlinked는 링크의 링크, 즉 심볼릭 링크다.
만약 symlinked가 가리키는 mine.c파일이 사라진다면, #1256의 데이터는 삭제되는 것인가?
아니다. #1256을 가리키는 또다른 링크 yours.c파일이 있기 때문에 #1256은 존재한다.
System call: fstat()
- 파일에 대한 정보를 가져오는 system call
- 성공 시 0, 실패 시 -1
'C' 카테고리의 다른 글
[시스템프로그래밍] ch.4 pwd 복습 (0) | 2023.10.26 |
---|---|
[시스템프로그래밍] ls 명령어 구현 (-al, -alR) (0) | 2023.10.13 |