
열려고 하는 해당 파일을 포인터로 받음
파일 열기가 실패하면 -1을 반환하고 성공하면 file Descriptor 값을 반환한다.
int open(const char *file)
쉽게 파일을 구분할 수 있는 식별자라고 생각하면 된다.
이 식별자는 file Descriptor 라는 테이블에 담겨서 관리가 되는데,
하나의 배열이라고 생각하면 된다.
배열의 요소에는 파일이 들어가고, 그 요소의 인덱스가 바로 file Descriptor
//thread.h
#ifdef USERPROG
int exit_status; // exit() 또는 wait() 구현에 사용되는 변수
struct file *fdt[64]; // 파일 디스크립터 테이블
static void
init_thread(struct thread *t, const char *name, int priority)
{
ASSERT(t != NULL);
ASSERT(PRI_MIN <= priority && priority <= PRI_MAX);
ASSERT(name != NULL);
memset(t, 0, sizeof *t);
t->status = THREAD_BLOCKED;
strlcpy(t->name, name, sizeof t->name);
t->tf.rsp = (uint64_t)t + PGSIZE - sizeof(void *);
t->priority = priority;
t->magic = THREAD_MAGIC;
t->origin_priority = priority;
for (int i = 0; i < 64; i++)
{
t->fdt[i] = NULL;
}
list_init(&t->donations); // donation 리스트 시작
}
open()
인자로 받은 파일, 파일 시스템에서 열기
현재 스레드의 fdt 가져오기
fd를 2부터 돌면서 빈 fdt 자리에 집어넣기
- 2부터 도는 것은 0과 1은 stdin, stdout이니까@
만약 자리를 찾으면 스레드의 fdt에 넣고 그때의 idx를 반환.
int open(const char *file)
{
check_address(file); // 주소 유효성 검사
struct file *open_file = filesys_open(file); // 파일 시스템에서 파일 열기
struct thread *curr = thread_current();
if (open_file == NULL)
{
return -1;
}
else
{
for (int i = 2; i < 64; i++)
{
if (curr->fdt[i] == NULL)
{
curr->fdt[i] = open_file;
return i;
}
}
}
}
pass tests/userprog/create-bound
pass tests/userprog/open-normal
pass tests/userprog/open-missing
pass tests/userprog/open-boundary
pass tests/userprog/open-empty
pass tests/userprog/open-null
FAIL tests/userprog/open-bad-ptr
저기 나머지 하나는 pm14? 구조체 쓰는거라는데 아직 잘 모르겠다... 해야지...
function solution(s) {
var answer = [];
let str = s
str = str.split(' ').map(Number);
let max = Math.max(...str);
let min = Math.min(...str);
answer.push(min);
answer.push(max);
return answer.join(' ');
}
function solution(s) {
const arr = s.split(' ');
return Math.min(...arr)+' '+Math.max(...arr);
}
진짜 이거 보고 어이가 없었다.
저 Math 모듈이 문자열도 형변환을 알아서 해서 최소, 최대를 찾아준다는게...
JS야 너 너무 Dynamic 해....
open 함수를 구현하는데 정신팔린 나머지 어제 TIL을 빼먹었다...
나의 48시간.... 헤헤...