시스템 프로그래밍 포스팅의 Linux1,2,3) 은 시스템 프로그래밍을 위해 필요한 기본 리눅스 개념만 정리한 것이다.
1-1. 파일 디스크립터
파일 디스크립터란 open을 통해 열면 리턴되는 값으로 파일 디스크립터 정수 값이 리턴되는데 그 값은 open으로 연 해당 파일을 가리키고 있으며 파일 디스크립터에는 다양한 정보를 담고 있다.
1-2. System call: open
파일을 열면 처음부터 읽을 수 있고 중간부터 읽을 수 있다. (사용자가 지정할 수 있다.)
하지만 파일을 열 때 따로 지정을 하지 않고 파일을 처음 읽으면 offset은 0이 되고
(이 값이 –1이 될 수는 없다.) 파일의 끝은 eof가 된다.
1-3. System call: write
그리고 쓸 때 역시 append 모드가 아니면 offset이 0을 가리켜 처음부터 쓰게 된다. append모드는 eof부터 이어서 쓸 수 있도록 해준다.
파일을 쓸때는 반드시 두 가지 경우이다.
처음부터 다시 덮어쓰거나, 끝에서부터 append하거나 둘 중 하나뿐이다.
1-4. Truncation
기존의 파일을 자를 수 있다는 개념이 truncation이다. 파일을 truncation할 때 자른 크기만큼이 될 수 있고 자른 크기보다 더 클 수 있는데 큰 경우는 빈 공간에 0으로 채워지게 된다.
(자른 크기보다 작을 순 없다!)
1-5. Multi-accessing
파일을 열었는데 두 개 이상의 프로세스가 하나의 파일에 접근하는 것이 가능하다.
또 같은 프로세스에서 같은 파일을 두 번 열어서 fd1과 fd2를 받을 것인데 이 fd1과 fd2가 서로 같을 수 있고 다를수도 있다.
서로 다른 프로세스가 파일에 접근할 때 스케줄링을 한다. 스케줄링을하지 않으면 여러 프로세스가 동시에 파일을 쓰기 떄문에 문제가 발생한다.
1-6. inode
우리가 보는 리눅스 파일을 파일 이름으르 보지만 컴퓨터에 저장된 파일의 정보는 inode 라는 정보로 파일이 저장되어 있다.
시스템이 파일을 찾기위해서는 inode 라는 시스템을 거친다.
우리가 open이라는 System call로 파일을 열기 위해 파일의 이름을 준다.
그럼 그 파일의 이름을 가지고 inode 시스템에서는 파일 이름에 매핑되어 있는 inode number를 확인한다. 그리고 일치하면 그 파일의 파일 디스크립터를 리턴 값으로 넘겨주게 되고 우리는 그 파일 디스크립터를 통해 파일에 접근이 가능해진다.
그리고 동일 시스템에서 inode number는 같은 값들이 있을 수 있다. 하지만 같은 inode number 라도 동일한 디렉토리의 동일한 inode는 없다. 따라서 inode number는 같을지라도 디렉토리가 다르므로 구별이 가능하다.
1-7. 디렉토리
파일들을 묶어놓는 역할로 디렉토리 역시 파일이다.
디렉토리는 사람이 읽을 수 있는 파일의 이름과 inode_numbers로 mapping 해주는 것이 다.
커널은 inode(information node)라는 노드 번호를 가지고 저장소에 있는 파일을 구분한다.
inode는 반드시 시스템 전역에 걸쳐 유니크할 필요는 없다. 하지만 파일이 유니크하게 만들어주는 것이 디렉토리이다.
inode는 일종의 파일 정보이다. 마지막으로 수정된 날짜 위치한곳 등등을 리눅스 파일의 inode라고 한다.
1-8. inode와 file descriptor 정리
정리하면 inode는 파일을 시스템 내부적으로 구분하기 위한 값이고 파일 이름과 매핑되어있따.
파일 디스크립터는 프로그래밍에서 inode 값을 통해서 식별된 파일을 접근하기 위한 값이다.
2-1 하드링크(파일링크) ln
위 코드는 기존의 dog.txt 라는 파일이 있었고 이 파일을 하드링크로 만든 두 파일을 만들었다.
파일 링크를 만드는 것은 위 사진과 같이 기존의 dog.txt 파일의 내용을 직접 가리키는 동일한 두 파일을 만드는 것이다.
하드링크 파일에는 두 가지 특징이 있다.
- 만약 원본 파일의 내용을 수정하면 3개의 파일의 권한, 수정 날짜등 함께 동일하게 바뀐다. 당연한것이 셋다 동일한 파일을 가리키고 있기 때문이다. 따라서 하드링크는 원본파일의 변화에 영향을 받는다고 말할 수 있다.
- 원본 파일이 삭제되더라도 하드링크 파일은 그대로 dog.txt 파일을 가리키고 있다.
2-2 소프트 링크(심볼릭 링크) ln -s
소프트 링크는 기존의 dog.txt 파일을 가리키는 것이 아닌 dog.txt 이름을 가리킨다고 생가각하면된다.
따라서 소프트 링크는 자신만의 inode를 가지게 되고 dog.txt 파일의 내용이 수정된다해도 소프트 링크 파일의 inode 정보는 수정되지 않는다.
이때 원본 파일 dog.txt 를 삭제하면 소프트 링크는 가리키고 있는 파일이 없게되고 아래와 같이 된다.
'전공 > 시스템 프로그래밍(운영체제)' 카테고리의 다른 글
3. System Call: read, write (0) | 2021.10.16 |
---|---|
2. System Call: open (0) | 2021.10.12 |
1. 시스템 구조와 시스템 라이브러리 (0) | 2021.10.12 |
Linux3) 리눅스 사용자 계정 (0) | 2021.10.12 |
Linux2) 프로세스 (0) | 2021.10.12 |