나머지 7개 시스템 콜에 대해 알아보자.
project2에서 구현해야하는 시스템 콜들을 구현해봤다. 아직 시스템콜에 대해서 100% 이해하지 못했다. OS 프로젝트가 끝날 때까지 차근차근 이해를 위해 노력해보자.
열린 파일(fd)의 크기를 리턴한다. (바이트 크기)
int filesize(int fd) {
struct file *open_file = process_get_file(fd);
if (open_file){
return file_length(open_file);
}
return -1;
}
파일(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;
}
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;
}
열린 파일의 위치를 position 크기만큼 이동한다.
void seek(int fd, unsigned position) {
if (process_get_file(fd) != NULL)
{
file_seek(process_get_file(fd), position);
}
}
열린 파일의 위치를 알려준다. 성공 시 파일의 위치를 리턴하고, 실패 시 -1을 리턴한다.
void tell(int fd) {
if (process_get_file(fd) != NULL) {
return file_tell(process_get_file(fd));
}
}
열려있는 file을 닫는다. 해당하는 fd를 NULL로 만들어준다.
void close(int fd) {
process_close_file(fd);
}
부모의 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;
}