-
[PintOS] Project 2 - System Call (3)Projects/Krafton_Jungle_4 2024. 3. 20. 10:18728x90
(2)에 이어서 구현중이다
close
파일디스크립터를 닫는다.
프로세스가 종료되거나 중단될 때, 해당 프로세스의 모든 열린 파일 디스크립터가 암묵적으로 닫힌다.
마치 이 함수를 각각의 파일 디스크립터에 대해 호출한 것과 같은 효과가 있다.
구현을 위해서는 file_close를 사용해야하고, 파일 디스크립터 테이블에서 fd에 해당하는 파일을 제거하는 함수를 새로 만들어 주어야 한다.
// userprog/process.c void process_close_flie(int fd) { struct thread *curr = thread_current(); curr->fdt[fd] = NULL; } // userprog/syscall.c void close(int fd) { file_close(process_get_file(fd)); process_close_file(fd); }
read
fd로 열린 파일에서 size 바이트의 데이터를 읽어와서 buffer에 저장한다.
read는 실제로 읽어온 바이트 수를 반환한다. 파일에 끝에 도달하면 0을 반환한다. 즉, 더 읽을 내용이 없을 때 0을 반환한다.
파일의 끝에 도달한 경우 이외의 다른 이유로 파일을 읽을 수 없는 경우 -1을 반환한다.
예를 들어 파일이 존재하지 않거나 읽기 권한이 없는 경우 등이다.
fd가 0인 경우 read 함수는 키보드로부터 데이터를 읽어온다.
fd가 0이라는 말은 input을 대기중이라는 상태인 것 같다. 따라서 input을 읽어와서 size만큼 값을 읽어야 한다.
이 때 input_getc()를 이용해 키보드 입력을 받는다.read를 구현하기 위해서는 fd의 값에 따라 다른 로직을 세워야 한다.
fd가 0인 경우 키보드로부터 입력을 받아오는 input_getc를 호출해 size만큼 값을 읽고
fd가 2보다 작은 경우 ( = 1인 경우) standard input이 아닌 output이므로 -1을 리턴한다.
이외의 경우는 process_get_file을 호출해 fd에 해당하는 파일 객체를 찾는다.
찾은 파일 객체를 인자로 file_read 함수를 호출한다.
중간 중간 테스트 케이스를 돌려보면서 디버깅 중이다. 와중에 tests/userprog/open-twice가 fail이 났었는데 문제는 process_add_file에 있었다.
int process_add_file(struct file *f) { struct thread *t = thread_current(); for (int i = 2; i < 128; i++) { if (t->fdt[i] == NULL) { t->fdt[i] = f; return i; } } return -1; }
여기서 return -1; 이 for문 안에 있었다..
다시 read로 돌아와 보자면
int read(int fd, void *buffer, unsigned size) { check_address(buffer); if (fd == 0) { for (int i = 0; i < size; i++) { ((char *)buffer)[i] = input_getc(); } } if (fd == 1) { return -1; } return file_read(process_get_file(fd), buffer, size); }
여기까지 했을 때 6개 중 2개 빼고 다 실패다. 뭔가 잘못되었다는 것이겠지.
이후 구현은 팀원과 페어 프로그래밍을 통해 진행했다.
'Projects > Krafton_Jungle_4' 카테고리의 다른 글
[PintOS] Project 3 - Virtual Memory, Anonymous page (1) (0) 2024.03.27 [PintOS] Project 3 - Virtual Memory git book, Introduction (2) 2024.03.23 [PintOS] Project 2 - System Call (2) (0) 2024.03.19 [PintOS] Project 2 - User Memory Access (1) (0) 2024.03.18 [PintOS] Project 2 - Argument Passing (2) (4) 2024.03.16