카테고리 없음

[컴퓨터시스템] 10장 I/O 입출력

하루설렘 2021. 12. 22. 21:08

I/O Overview

  • Linux환경에서 모든 device들은 file로 취급한다. (우리가 열고 닫고, 읽고, 쓰는 file)
    • /dev/sda2 (/usr disk partition)
    • /dev/tty2 (terminal)
  • 심지어 커널 (kernel) 조차 파일로서 취급
    • /boot/vmlinuz-3.13.0-55-generic (kernel image)
    • /proc (kernel data structures)
※ simple interface
- open() and close()
- read() and write()
- lseek() : indicates next offset into file to read or write

 

File Types

  • Regular files : (text files/Binary files)
  • Directory
  • Socket
File의 끝은 => EOL (End Of Line)
- linux and max os : '\n'
- window and internet protocols '\r\n'
Directory (Link array로 구성)
- .(dot) : 현재 디렉토리
- ..(dot dot) : 부모 디렉토리
- mkdir(빈 디렉토리 만들기)/ ls(현 디렉토리 내용확인)/ rmdir(빈 디렉토리 삭제)

 

 

File Descriptor (파일 식별자)

file descriptor란, 실제로 파일을 열 때 부여하는 번호를 의미한다. (학번, 주민번호같은 느낌)

Linux shell에서 만들어진 각 프로세스는 터미널과 관련된  세 가지 파일을 연다. 

  •  0 : stdin (standard input) ; 키보드에서 타이핑하면 0번 파일에 쓰여진다. 
  •  1 : stdout (standard output) ; 모니터로 연결되어있는 파일
  •  2 : stderr (standard error) ; 모니터로 연결되어있고, 버퍼없이 바로 출력하는 특징

 

 

  • open/close
  • read : 현 file position에서 memory로 bytes를 복사하는 것 
    • Short counts가 간혹 발생할 수 있고 error는 아니다. 
char buf[512];
int fd;       /* file descriptor */
int nbytes;   /* number of bytes read */

/* Open file fd ...  */
/* Then read up to 512 bytes from file fd */
if ((nbytes = read(fd, buf, sizeof(buf))) < 0) {
   perror("read");
   exit(1);
}
  • write : memory에서 현 file position으로 복사하는 것 (w/ changing current position)
    • Shorts counts 역시 간혹 발생할 수 있고, error는 아니다. 
char buf[512];
int fd;       /* file descriptor */
int nbytes;   /* number of bytes read */

/* Open the file fd ... */
/* Then write up to 512 bytes from buf to file fd */
if ((nbytes = write(fd, buf, sizeof(buf)) < 0) {
   perror("write");
   exit(1);
}