System-level I/O: File sharing(16)

G·2022년 11월 27일
0

2-2 System programming

목록 보기
14/15

System-level I/O

Contents

  • Data Structures for System level I/O
  • No sharing
  • File sharing
  • Inherits its parent’s open files
  • Redirection

Data Structures for System level I/O


이전 포스트에서 알아본 파일을 open 했을 때의 형태이다. Open file descriptor table은 프로세스마다 존재한다. 이후 file struct, inode struct는 프로세스간의 공유가 가능하다.

Open()


프로세스에서 파일을 만들거나 열 때, 사용하는 system call이다. 첫 번째 인자는 파일의 경로이다. 경로에 따라서 metadata와 data block에 접근하면서 I/O 작업을 한다. 메모리 상에는 file struct, inode struct를 load한다.
flag 인자의 옵션이다.

  • O_RDONLY Reading only
  • O_WRONLY Writing only
  • O_RDWR Reading and writing
  • O_CREAT If the file doesn’t exist, then create a truncated(empty) version of it.
  • O_TRUNC. If the file already exists, then truncate it.
  • O_APPEND. Before each write operation, set the file position to the end of the file.
    이도 bit로 연결할 수 있다.

close


파일을 close하고 성공하면 0 실패하면 -1이다.
open() syscall에서 받은 fd를 인자로 받는다.
fd를 잘 관리해야한다. 파일 경로명으로 파일을 읽는다면 비용이 크기 때문에, fd를 통해서 읽는 것이 효율적이기 때문이다.

Read


인자로 fd와 읽어온 byte를 저장할 buffer, 읽어올 사이즈를 인자로 받는다. return 값이 0보다 작다면 에러이다.
Short counts 즉, 인자로 전달한 size보다 덜 받아올 수 있다. 이는 에러가 아니다.
옵션이 0이라면 키보드에서 읽는다.

Write

Read와 동일하고 읽어오는 것이 아닌 파일에 작성한다.
fd가 1,2 이면 printf와 동일하다. screen에 출력한다.


위는 예시이다.
S_IRUS | S_IWUSR | S_IRGRP | S_IROTH 부분을 확인해보면,
각각 user read, user write, group read, owner read이다.(각각 4244)
이는 8진수로 0644로 표현할 수 있다.
그리고 0은 NULL이고 0이 아닐 때 까지 계속 0을 받아온다.

Accessing Directories

디렉토리도 하나의 파일이다. 디렉토리도 메타 데이터와 파일 데이터가 필요하다. 파일 데이터엔 파일 name과 i-number가 존재한다. open, read, close, DIR이 존재한다. DIR은 경로명을 인자로 전달하면 DIR를 반환한다. 이는 디렉토리의 정보를 담은 구조체이다. 이를 통해 read한다면 디렉토리의 entry가 나온다. 또 한 번 호출한다면 다음 entry가 나온다.

No sharing


프로세스간 sharing이 없을 때이다.
inode struct는 per a file이다. 하나의 파일당 하나밖에 존재하지 않는다.
file struct는 공유할 수 있고 하지 않을 수도 있다. 위의 이미지는 서로 다른 파일을 가리키는 내부 구조의 모습이다.

File sharing


하나의 파일을 하나의 프로세스가 공유할 때이다.

둘 다 a가 출력된다 position을 공유하지 않기 때문이다.

fork 했을 때이다. 그렇다면 parent의 file descriptor를 상속받는다.
현재 entry를 공유하고 있다. position을 같이 사용하고 있다는 것이다.

공유되고 있기 때문에 b가 출력될 것이다.
wait는 자식 프로세스 이후에 호출하기 위함이다.

I/O Redirection

표준 입력, 출력의 방향을 바꿀 수 있다 예를 들어 ls는 표준 출력으로 screen에 출력이되는데 이것을 파일로 방향을 바꾸어 출력하는 것이다
ls > file.txt의 내부적으로 바뀌는 모습을 알아보자.

ls가 exec() 하기 이전에 ls의 출력을 저장할 파일을 open한다. 지금 fd4에 있는 것을 확인할 수 있다. 이 fd4는 file.txt의 entry를 가지고 있기 때문에 이를 fd1에 복사해준다면 screen에 출력되어야 할 byte가 fd4에 있는 파일에 출력이 되는 것이다.

위의 사진은 fd4에 file.txt를 open한 상태이다.
이후에 fd1에 fd4의 entry를 복사하여 출력한다면 파일에 ls 출력값이 저장될 것이다.

profile
열심히 안 사는 사람

0개의 댓글