개요
- Input/Output (I/O) 는 메인메모리와 외부 디바이스(disk drive, terminal, network) 사이의 데이터 복사의 과정을 말함
- Unix 시스템에서는 고수준의 I/O 함수들은 커널에 의해 제공되는 시스템 레벨 Unix i/o 함수들에 의해 구현됨
- 대부분은 고수준의 I/O 함수는 잘 작동하고 Unix I/O를 직접 사용할 필요는 없다.
- 왜 Unix I/O에 대해서 알아야 해?
- Unix I/O를 이해하는 것은 다른 시스템 컨셉에 대해 이해하는데 도움을 준다. i/o는 시스템의 운영에 필수적인 부분이고 이것 때문에 우리는 순환참조 문제에 자주 맞닥뜨린다(I/O와 다른 시스템 아이디어들 사이에)
- 때때로 고수준의 i/o함수들 만으로는 불가능한 경우가 있음(예를 들어 file의 meta data, file size, file creation time 등). 이럴 때 Unix I/O를 직접 사용해야 할수 있음.
- 그리고 네트워크 프로그래밍 에서는 standard I/O 는 risky하다
Unix I/O
- 모든 I/O 장치(네트워크, 디스크, 터미널..) 는 파일로 모델링됨
- 모든 입력과 출력은 적절한 파일을 읽고 쓰는 작업에 의해 수행됨
- 이러한 device → file 매핑은 Unix kernel이 단순하고 저수준의 application interface 즉, Unix I/O를 export하게 해줌 ↔ 모든 입력과 출력이 uniform and consistent way로 다뤄질 수 있도록 해줌
- Opening Files : 어플리케이션이 I/O 장치에 접근하겠다고 하면 kernel에게 해당 파일을 열어 달라고 요청을 함. kernel은 descriptor 라는 nonnegative 정수값을 반환함(이후 과정에서 파일을 식별할 수 있는 값)
- Changing the current file position
- Reading and writing files
- buffer를 이용하게 되면 바이트 한 개씩 읽어서 메모리로 옮기는게 아닌 한번에 많은 양을 옮길 수 있기 때문에 Unix I/O의 system call을 최소화 할 수 있음
- Closing files
I/O Redirection
unix > ls > foo.txt
- shell 이 ls 를 실행한 후, standard output을 disk file foo.txt로 redirect하는 것임
Standard I/O
- ANSI C는 프로그래머에게 Unix I/O의 상위 호환으로 Standard I/O라는 고수준의 입출력 함수를 정의했음.
- open and close files(fopen and fclose)
- reading and writing bytes(fread and fwrite)
- reading and writing strings (fgets and fputs)
- sophisticated formatted I/O (scanf and printf)
- Standard I/O 라이브러리는 open file을 stream으로 모델링하였음
- 프로그래머에게 stream은 FILE 구조체에 대한 포인터임