210212 개발일지(67일차) - 운영체제(OS) 프로젝트 #2-4 : System Call 구현(3)

고재개발·2021년 2월 13일
0

OS Project

목록 보기
14/28

나머지 7개 시스템 콜에 대해 알아보자.
project2에서 구현해야하는 시스템 콜들을 구현해봤다. 아직 시스템콜에 대해서 100% 이해하지 못했다. OS 프로젝트가 끝날 때까지 차근차근 이해를 위해 노력해보자.

int filesize(int fd)

열린 파일(fd)의 크기를 리턴한다. (바이트 크기)

int filesize(int fd) {
    struct file *open_file = process_get_file(fd);
    if (open_file){
        return file_length(open_file);
    }
    return -1;
}

int read(int fd, void *buffer, unsigned size)

파일(fd)에서 크기 바이트를 버퍼로 읽는다. 실제로 읽은 바이트 수를 리턴한다. 못 읽을 때는 -1을 리턴한다. fd가 0일 경우에는 input_getc() 함수를 활용해서 키보드로부터 값을 읽는다.

int read(int fd, void *buffer, unsigned size)
{
    int read_result;

    lock_acquire(&filesys_lock);
    if (fd == 0) {
        read_result = input_getc();
    }
    else {
        if (process_get_file(fd) != NULL) {
            read_result = file_read(process_get_file(fd), buffer, size);
        }
        else {
            read_result = -1;
        }
    }
    lock_release(&filesys_lock);
    return read_result;
}

int write(int fd, const void *buffer, unsigned size)

fd가 1이면, 콘솔에 putbuf()를 활용해서 wirte한다.
열린 파일(fd)의 버퍼에 바이트 사이즈 만큼을 쓰고, 실제로 쓴 바이트 수를 리턴한다. 에러인 경우 -1을 리턴한다. 에러는 아니지만 쓸 수 있는 공간이 없으면 0이 리턴된다.

int write(int fd, const void *buffer, unsigned size)
{
    int write_result;
    lock_acquire(&filesys_lock);
    if (fd == 1) {
        putbuf(buffer, size);
        write_result = size;
    }
    else {
        if (process_get_file(fd) != NULL) {
            write_result = file_write(process_get_file(fd), buffer, size);
        }
        else{
            write_result = -1;
        }
    }
    lock_release(&filesys_lock);
    return write_result;
}

void seek(int fd, unsigned position)

열린 파일의 위치를 position 크기만큼 이동한다.

void seek(int fd, unsigned position) {
    if (process_get_file(fd) != NULL)
    {
        file_seek(process_get_file(fd), position);
    }
}

void tell(int fd)

열린 파일의 위치를 알려준다. 성공 시 파일의 위치를 리턴하고, 실패 시 -1을 리턴한다.

void tell(int fd) {
    if (process_get_file(fd) != NULL) {
        return file_tell(process_get_file(fd));
    }
}

void close(int fd)

열려있는 file을 닫는다. 해당하는 fd를 NULL로 만들어준다.

void close(int fd) {
    process_close_file(fd);
}

pid_t fork (const char *thread_name)

부모의 thread(process)를 복사한다.

pid_t fork (const char *thread_name){
    struct intr_frame *user_tf = &thread_current()->fork_tf;
    pid_t child_pid = process_fork(thread_name, user_tf);
    sema_down(&get_child_process(child_pid)->load_lock);
    return child_pid;
}
profile
고재개발

0개의 댓글