System-Level I/O
youngwiki
상위 문서: 컴퓨터 시스템
개요
입출력(I/O)은 주기억장치(main memory)와 디스크 드라이브, 터미널, 네트워크와 같은 외부 장치(external devices) 사이에서 데이터를 복사하는 과정이다. 입력 연산(input operation)은 I/O 장치로부터 데이터를 주기억장치로 복사하고, 출력 연산(output operation)은 데이터를 주기억장치에서 장치로 복사한다.
해당 문서에서는 UNIX I/O와 표준 I/O의 일반적인 개념과, C 프로그램에서 이를 안정적으로 사용하는 방법을 설명한다.
UNIX I/O
리눅스 파일은 아래와 같은 m 바이트의 시퀸스로 구성된다.
B1, B2, ..., Bk, ..., Bm-1
모든 I/O 장치들(예: 네트워크, 디스크, 터미널, 커널! 등)은 아래와 같이 파일로 모델링되며, 모든 I/O는 해당 파일들을 읽고 쓰는 방식으로 수행된다.
/dev/sda2 (/usrdiskpartition) /dev/tty2 (terminal) /boot/vmlinuz-3.13.0-55-generic (kernel image) /proc (kernel data structures)
I/O 장치들을 모두 파일로 매핑하는 방식 덕분에, 리눅스 커널은 UNIX I/O로 불리는 단순하고 저수준(low-level)의 인터페이스를 제공할 수 있다. 이를 통해 모든 I/O 작업들을 일관되고 통일된 방식으로 수행할 수 있다.
Files
각 리눅스 시스템 내에서의 역할을 나타내는 type을 가진다:
- 일반 파일(regular file)은 임의의 데이터로 구성된다. 애플리케이션 들은 종종 일반 파일 들을 ASCII 혹은 유니코드 문자만을 포함하는 텍스트 파일(text file)과, 그 외의 모든 것을 포함하는 바이너리 파일(binary file) 을 구분하지만, 커널은 이를 구분하지 않는다. 따라서 UNIX I/O도 텍스트 파일과 바이너리 파일을 구분하지 않는다. 리눅스 텍스트 파일은 단순히 텍스트 라인들의 시퀸스(sequence of text lines)로 구성되며, 각 줄(text line)은 문자들의 시퀸스(sequence of characters)로 이루어지고 줄바꿈 문자('\n')[1]로 종료된다.
- 디렉토리(directory)는 링크(link)들의 배열로 구성된 파일이며, 각 링크는 파일 이름을 파일(혹은 디렉토리)에 매핑한다. 각 디렉토리는 적어도 두 개의 항목을 가지고 있다. 먼저
.는 디렉토리 자신을 가리키는 링크이고, 그리고..는 디렉토리 계층 구조에서 상위 디렉토리를 가리키는 링크이다. 디렉토리는mkdir명령어로 만들 수 있고,ls명령어로 안의 내용을 볼 수 있으며,rmdir명령어를 통해서 삭제할 수 있다.
각주
- ↑ 줄 바꿈 문자는 0x0a에 해당하며, 이는 ASCII 값과 동일하다.