출처: https://3months.tistory.com/307 [Deep Play]

4-1/시스템프로그래밍

Unix I/O, RIO package

코딩하는 랄뚜기 2022. 4. 4. 09:56

Unix I/O Overview

 

모든 I/O device는 file로 표현 된다. (ex /dev/sda2, /dec/tty2)

심지어 커널까지도...

 

Hardware device를 file에 mapping 시키는 것은 Unix I/O라는 간단한 interface를 kernel이 이용할 수 있게 한다.

  • open() - I/O device에 접근한다.
  • close()  - I/O device에 접근을 종료한다.
  • read() - 파일에서 n byte를 읽어 메모리에 가져온다.
  • write() - 메모리에 n byte를 파일에 저장한다.
  • lseek() - 현재 file position을 바꾼다.

 

 


 

File Types

 

각각의 file들은 역할을 나타내는 type을 가지고 있다.

  • Regular file
  • Directory
  • Soket

 


 

Regular Files

 

Regular file은 임의의 data를 가지고 있다.

Text file이나 binary file로 나뉘어 지는데 kernel은 이 둘을 구분할 줄 모른다.

Text fileASCII 또는 Unicode character로 이루어져 있고 Binary file은 object file이나 JPEG와 같이 Text file이 아닌 모든 file을 말한다.

 

 


 

Directories

 

Directory는 link배열을 포함한다. 각각의 link는 filename을 file에 보여주고 있다.

Directory는 적어도 두 개의 entry를 가지고 있는데 .(dot)은 자기 자신에 대한 link이고 ..(dot dot)은 parent directory에 대한 link이다.

 

Directory와 관련된 명령어

  • mkdir : empty directory를 만든다
  • ls : directory 안에 있는 content를 보여준다.
  • rmdir : empty directory를 삭제한다.

 

모든 file은 /(slash)로 표현되는 root directory와 연결되어 있다.

 

cwd는 current working directory를 의미한다.

/(slash)를 이용하여 pathname을 표현 할 수 있다.

 


 

Opening,Closing Files

 

Open 함수를 이용하여 file을 여는 것은 file에 접근할 수 있다는 것을 kernel에게 알려준다.

Open 함수가 -1을 return하면 file을 열지 못한다는 것을 의미한다.

File descriptor에서 0(stdin), 1(stdout), 2(stderr)는 고정되어있다.

 

Close 함수는 kernel에게 file에 접근하는 것을 kernel 끝낸다고 알려준다.

Close된 file을 다시 close하는 것은 매우 위험한 일이기 때문에 return 값을 항상 확인하고 이에 맞게 handling 해줘야 한다.

 


 

Reading,Writing Files

 

Reading은 현재 file position에서 file을 복사하여 memory에 올려놓고 file position은 update한다.

 

buf는 file이 memory에 쓰여질 위치를 나타내는데 당연히 file의 크기(n byte)보다 커야한다.

ssize_t라는 signed integer 값을 return하며 Short counts( nbytes < sizeof(buf) )가 가능하다.

 

Writing은 memory에 있는 file을 현재 file position에 복사하고 update를 해준다.

Reading과 마찬가지고 Short count를 지원한다.

 

※short count에 관해서

short count는 EOF(end-of-file)을 읽었을 때, terminal에서 text line을 읽을 때, network soket에서 reading이나 writing을 할 때 발생한다.

Disk에서는 파일을 항상 block 단위로 수정해야하므로 short count가 불가능하다.

 


 

RIO(robust I/O)

 

RIO는 network program과 같이 short count를 할 수 있는 I/O app을 더 효과적으로 사용할 수 있게 해준다.

 

RIO는 두 가지 다른 기능을 제공한다.

  • Unbuffered input and output of binary data
    • rio_readn, rio_writen
  • Buffered input of text lines and binary data 
    • rio_realineb, rio_readnb
    • thread-safe하고 interleaved 될 수 있다.

Buffered I/O는 block만큼 data를 memory에 올려주기 때문에 system call을 줄일 수 있으므로 효율적이다.

'4-1 > 시스템프로그래밍' 카테고리의 다른 글

Standard I/O, Unix I/O vs Standard I/O vs RIO  (0) 2022.04.04
Metadata, sharing and redirection  (0) 2022.04.04
Signal  (0) 2022.03.28
Shell  (0) 2022.03.22
Process Control  (0) 2022.03.15