동기화 관련 API
void lock_init (struct lock *)
void lock_acquire (struct lock *)
void lock_release (struct lock *)
📟 int read (int fd , void *buffer unsigned size);
구현 설명
- 열린 파일의 데이터를 읽는 시스템 콜
- 성공 시 읽은 바이트 수를 반환, 실패 시 -1 반환
buffer
: 읽은 데이터를 저장할 버퍼의 주소 값
size
: 읽을 데이터 크기
fd
값이 0일 때 키보드의 데이터를 읽어 버퍼에 저장. (input_getc()
이용)
int read (int fd, void *buffer, unsigned size)
{
check_address(buffer);
int ret;
struct thread *curr = thread_current ();
struct file *file_obj = process_get_file(fd);
if (file_obj == NULL)
return -1;
if (file_obj == 1) {
if (curr->stdin_count == 0) {
NOT_REACHED();
}
int i;
unsigned char *buf = buffer;
for (i = 0; i < size; i++) {
char c = input_getc();
*buf++ = c;
if (c == '\0')
break;
}
return i;
}
if (file_obj == 2) {
return -1;
}
lock_acquire (&filesys_lock);
ret = file_read(file_obj, buffer, size);
lock_release (&filesys_lock);
return ret;
}
file_read
: 파일에 데이터를 읽는 함수
NOT_REACHED()
: schedule 이후 run이었던 thread의 context는 실행되지 않는다.
#define NOT_REACHED() PANIC ("executed an unreachable statement");
📟 int write (int fd, const void *buffer, unsigned size);
- 열린 파일의 데이터를 기록 시스템
- buffer가
read와
달리 const인 이유는 memory에 적는게 목적이 아닌, disk에 쓰는 것이 목적이기 때문에 memory에서의 수정을 방지하기 위해 const void *buffer
를 사용한다.
구현 설명
- 열린 파일의 데이터를 기록 시스템 콜
- 성공 시 기록한 데이터의 바이트 수를 반환, 실패시 -1 반환
buffer
: 기록 할 데이터를 저장한 버퍼의 주소 값
size
: 기록할 데이터 크기
fd
값이 1일 때 버퍼에 저장된 데이터를 화면에 출력. (putbuf()
이용)
int write (int fd, const void *buffer, unsigned size)
{
check_address(buffer);
int ret;
struct thread *curr = thread_current ();
struct file *file_obj = process_get_file(fd);
if (file_obj == NULL)
return -1;
if (file_obj == 2) {
if (curr->stdout_count == 0) {
NOT_REACHED();
process_close_file(fd);
return -1;
}
putbuf(buffer, size);
return size;
}
if (file_obj == 1) {
return -1;
}
lock_acquire (&filesys_lock);
ret = file_write(file_obj, buffer, size);
lock_release (&filesys_lock);
return ret;
}
file_write
: 파일에 데이터를 기록하는 함수
📟 void seek (int fd, unsigned position);
- 열린 파일의 위치(offset)를 이동하는 시스템 콜
구현 설명
- 열린 파일의 위치(offset)를 이동하는 시스템 콜
Position
: 현재 위치(offset)를 기준으로 이동할 거리
void seek (int fd, unsigned position)
{
struct file *file_obj = process_get_file(fd);
if (file_obj <= 2)
return ;
file_obj->pos = position;
}
📟 unsigned tell (int fd);
- 열린 파일의 위치(offset)를 이동하는 시스템 콜
구현 설명
- 열린 파일의 위치(offset)를 알려주는 시스템 콜
- 성공 시 파일의 위치(offset)를 반환, 실패 시 -1 반환
unsigned tell (int fd)
{
struct file *file_obj = process_get_file(fd);
if (file_obj <= 2)
return ;
return file_tell(file_obj);
}
어후 블로그가 굉장히 복잡하게 생겼군여