[sw정글-북] 📚CSAPP 10장 System-Level I/O
카테고리: swjungle CSAPP
📚📚CSAPP 10장-System-Level I/O
🚀노션에서 업데이트 된 내용으로 보기
📚CSAPP 10장 <== 클릭
📚CSAPP 10장 <== 클릭
📚CSAPP 10장 <== 클릭
❗️출처: 하이애나 블로그
📕start
10장
- 입출력은 데이터를 복사하는 과정
- 유닉스 IO를 배워야 하는 이유
- 다른 시스템 개념을 이해하는데 도움이 됨
- 때로는 unix I/O 이외에 다른 방법이 없을 수 있다
- 10.1 Unix I/O
- 리눅스에서 파일은 파일은 연속된 m개의 바이트이다
- 파일 읽기, 파일 쓰기, 파일 닫기 등등
- 파일을 읽으려고 하면…
- 커널은 식별자(descriptor)을 리턴해줌 (양수 돌려줌)
- 바이트 오프셋
- 처음에는 파일의 머리부분에 있음
- 파일을 읽어들이다 보면 오프셋도 점점 커짐
- 파일의 크기가 m이라면…오프셋이 m까지 도달하면, 파일을 다 읽은거니까 EOF조건 발동!! 두둥
- 10.2 File
- 임의의 데이터를 포함함
- 커널은 텍스트, 이진파일 그냥 다 같은걸로 봄
- 디렉토리는 링크들의 배열로 구성되어있음
-
디렉토리 계층구조
- 임의의 데이터를 포함함
- 10.3 파일 열기와 닫기
-
식별자중 가장 낮은 번호, 그래서 3을 쓴다고 함
- flags인자는 어떻게 프로세스가 파일에 접근하는지를 알려줌
- 종류
- O_RDONLY: Reading only
- O_WRONLY: Writing only
- O_RDWR: Reading and writing
- append옵션으로 플래그 여러개 세울 수 있음
- O_CREAT: 파일 없으면 비어있는 파일을 생성
-
접근 권한 비트
-
위에 세개는 owner에 대한것, 그다음3개는 group, 그다음 세개는 다른사람들에 대한 것
-
이렇게 umask로 권한 빼줌(unmask)
- 모드 권한, 마스크 권한 따로 관리함(이유는 모름)
-
연습문제
- 0,1,2는 사용중이니까…. fd2는 3이 나옴
-
-
- 10.4 파일 읽기와 쓰기
read()
함수로 읽어올 때, 에러가 나면 -1 을 리턴한다- ( 0은 EOF )
- 짧은 카운터 리턴
- 50읽으려고 했는데, 20밖에없음 ⇒ 그래도 잘 찾아서 리턴해줌
- 짧은카운터 리턴 기능이 있어야 유용한듯
- 네트워크 지연때문에 짧은 카운터 리턴이 발생할 수 있음
- 10.5 Robust Reading and Writing with the Rio Package(=RIO-read, write)
- Rio는 짧은 카운터를 보장하는 이유가…. 네트워크 지원 등 여러가지 현상으로 short(정보가 끝까지 담기지 않음)가 발생해도, 끝가지 읽어냄
- 10.5.1 버퍼 없는 함수
rio_readn
rio writen
rio_read
- 30000(3만)
- text line일 때, 5+1(null) 해서 6바이트
- 바이너리일 때, short a = 30000; 이라면 short 자료구조상 8바이트
- 버퍼가 없는경우 바이너리가 효율적이기 때문에 binary를 사용함
- bianary를 여는 프로그램이 따로 필요함, 하지만 text는 바로 열린다
- text가 범용성이 좋기 때문에, binary가 아닌 text로 쓴다
- 10.5.2 버퍼 있는 함수
- null 문자가 있는지 1바이트씩 움직이면서 판단
- 🚀🚀🚀🚀🚀 텍스트 있을 때 버퍼 쓰면 됨🚀🚀🚀🚀🚀🚀🚀
- rio 완벽정리
- rio_readn 속에 read있음
- rio_readnb속에 rio_read있음
- 10.6 Reading File Metadata
- meta 정보의 정보(마우정!!마우스 우클릭 정보)
stat
← 구조체임- st_mode ← 구조체임
- 파일 권한 비트, 파일 타입을 인코딩 하고 있음
- st_size ← 구조체임
- 파일 크기를 바이트로 저장하고 있음
- 요렇게 찍어서 권한 확인 할 수 있음
- st_mode ← 구조체임
- 10.7 Reading Directory Contents
- opendir 오픈 디렉
- 경로이름을 받아서 디렉토리를 가리키는 포인터를 리턴
- opendir(
'.'
)- 현재 경로 오픈
-
readdir 디렉토리 읽기
- struct를 리턴함
d_ino
- 인덱싱 노드의 약자임
- closedir 디렉토리 닫기
- opendir 오픈 디렉
- 10.8 파일 공유
descriptor table
- 개개인의 프로세스가 모두 가진다
- 본인이 쓰는 파일 본인이 읽는 파일에 대한 식별자를 따로 테이블로 가지고 있음
open file table
- 오픈된 파일들을 저장하는 한개의 테이블이 있음
- 식별자를 닫으면 엔트리에서 참조 횟수를 감소
- 3곳에서쓰이고 있으면 3으로 표시하고 0이되면 테이블에서 삭제
v-node table
- 메타데이터가 저장되는 곳이 I-node임
- Inode 속에…
- 접근 권한
- 생성 등 다양한 권한들
- Inode는 모든 파일이 각자 1개씩 가지고 있음
- Inode는 바로 접근 가능하지만 Vnode는 커널에서 정보를 요청해야해서 오래걸림
- 그래서 정보를 따로 가지고 있음
- 그리고 Vnode는 공유할 정보들에 대한 값을 가지고 있음, 파일 공유 할 때 Inode에 대한 정보는 들어가지 않을듯?
-
포크되었을 때, 파일접근
- 10.9 I/O redirection
- linux> Is > too.txt
- ls가 현재 위치로 재지정됨
- #include
-
dup2(old fd, new fd) 이런식으로 복사시킴
-
이거 이해하면 dup2 이해한 것
- linux> Is > too.txt
- 10.10 표준 I/O
- 파일을 열거나 닫고(fopen, fclose )
- 바이트를 읽거나, 쓰고(fread, fwrite)
- 스트 링을 읽거나 쓰고(fgets, fputs)
- 복잡한 포맷을 갖는 I/O를 위한 함수(scanf, printf)
-
10.11 종합
- 가능하면 표준 입출력으로 써라
- 이진파일 할때는… 버퍼 없는거 써라
- (scanf, rio_readlinb) 쓰지 말아라
- 네트워크 소켓에서는 Rio써라
-
제약사항1
- 매 입력 연산 전에 버퍼를 비우는 방법을 채택하면 제약사항1을 피할 수 있다.
-
제약사항 2
- 동일한 오픈소켓 식별자에서 하나는 읽기용, 하나는 쓰기용으로 오픈한다
😵배우면서 깨달은 내용을 정리해 보았습니다. 틀린 것 같은 개념을 아래 댓글에 달아주시면 감사합니다😵
🌜 Thank you for reading it. Please leave your comments below😄
댓글 남기기