ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [PintOS] Project 2 - System Call (3)
    Projects/Krafton_Jungle_4 2024. 3. 20. 10:18
    728x90

    (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개 빼고 다 실패다. 뭔가 잘못되었다는 것이겠지.


    이후 구현은 팀원과 페어 프로그래밍을 통해 진행했다.

Designed by Tistory.