Advanced Programming in the UNIX Env. Chapter 3 review

Advanced Programming in the UNIX Env. Chapter 3 review

3. File I/O

3.1 Introduction

3.2 File Descriptors

File descriptor 0, 1, 2를 각각 stdin, stdout, stderr에 mapping하는 것은 UNIX Kernel의 기능이 아니라 shell과 많은 application들이 사용하는 convention이다.

3.3 open Function

Filename and Pathname Truncation

_POSIX_NO_TRUNC를 이용해서 truncation이 일어나는 대신 errno를 ENAMETOOLONG으로 설정하고 error를 리턴할 수 있다. 근데 정확히 어떻게 쓰라는 건지 모르겠음.

3.4 creat Function

The functionality of creat is subset of open.

creat(pathname, mode) is equivalent to open(pathname, O_WRONLY | O_CREAT | O_TRUNC, mode)

3.5 close Function 3.6 lseek Function

file offset = whence (SEEK_SET, SEEK_CUR or SEEK_END) + offset

pipe, FIFO or socket에 lseek을 쓰면 errno = ESPIPE, error를 리턴한다.

lseek(fd, positive_offset, SEEK_END)를 쓰면 어떻게 되는지 모르겠다.

-> 파일 끝보다 큰 offset에 write를 하면 파일의 크기가 그만큼 커진다.

실제로 disk block이 할당될지는 파일시스템의 implementation에 따라 다르다.

read의 경우에는 잘 모르겠다.

NEGATIVE offset is possible.

3.7 read Function

read가 요청한 양보다 더 적은 양을 읽는 경우 중 기억해 둘 만 한 것.

  • terminal device로 부터 읽을때. 보통 최대 한 line이 한번에 읽어진다.
  • 읽는 중 signal에 의해 interrupt되었지만 이미 일부를 읽었을 때.

3.8 write Function

3.9 I/O Efficiency

file system의 block size (보통 4096 bytes)의 n<10 배만큼씩 읽는 것이 유리하다.

3.10 File Sharing

Kernel data structures for open files

Kernel data structures for open files

3.11 Atomic Operations

pread and pwrite Functions: Atomic operations of lseek + read or write

  • The current file offset is not updated

3.12 dup and dup2 Functions

dup2는 새로 만들 fd가 이미 존재하면 그것을 닫아버린다.

단, dup2에 argument로 같은 fd를 넣으면 그것을 닫지 않고 그걸 리턴한다.

3.13 sync, fsync and fdatasync Functions

Kernel buffer (buffer cache)에서 write대기중인 data를 disk에 쓰는 동기화 function들이다.

Data write procedure

Data write procedure

3.14 fcntl Function

1. Duplicate an existing descriptor (cmd = F_DUPFD)

New fd는 file table entry를 share하지만 FD_CLOEXEC flag가 clear된 상태이다.

This means that the descriptor is left open across an exec.

2. Get/set file descriptor flags (cmd = F_GETFD or F_SETFD)

Fd flag (현재는 FD_CLOEXEC뿐)를 설정한다.

3. Get/set file status flags (cmd = F_GETFL or F_SETFL)

O_*SYNC와 같은 flag들은 경우에 따라 제대로 작동하지 않을 때도 있다.

4. Get/set asynchronous I/O ownership (cmd = F_GETOWN or F_SETOWN )

5. Get/set record locks (cmd = F_GETLK, F_SETLK, or F_SETLKW )

3.15 ioctl Function

ioctl(): 주로 device driver가 define해주는 io function

3.16 /dev/fd

편의를 위해 UNIX system이 제공하는 디렉토리

fd = open(“/dev/fd/0”, mode); is equivalent to fd = dup(0);

3.17 Summary

 

Leave a Reply