어제에 이어서 공부를 시작했습니다
int open (const char *file) {
check_address(file);
struct file *f = filesys_open(file);
if(f == NULL) {
return -1;
}
//파일 디스크립터 생성하기
int fd = process_add_file(f);
if(fd == -1) {
file_close(f);
}
return fd;
}
파일을 열기 위한 open 함수입니다
check_address(file);: check_address 함수를 호출하여 주소 유효성을 확인합니다. 이 함수는 주어진 주소가 유효한지 검사하고, 유효하지 않을 경우 프로세스를 종료합니다.
struct file *f = filesys_open(file);: 주어진 파일 경로를 이용하여 filesys_open 함수를 호출하여 파일을 엽니다. filesys_open 함수는 파일 시스템에서 해당 파일을 찾아서 열고, 해당 파일의 구조체 포인터를 반환합니다. 만약 파일을 열 수 없는 경우에는 NULL을 반환합니다.
if(f == NULL) { return -1; }: 파일을 열지 못한 경우(f가 NULL인 경우) -1을 반환하고 함수를 종료합니다. 이는 파일 열기에 실패한 경우를 나타냅니다.
int fd = process_add_file(f);: process_add_file 함수를 호출하여 파일 디스크립터를 생성합니다. process_add_file 함수는 현재 스레드의 파일 디스크립터 테이블에 파일 구조체를 추가하고, 해당 파일에 대한 파일 디스크립터 값을 반환합니다.
if(fd == -1) { file_close(f); }: 파일 디스크립터 생성에 실패한 경우(fd가 -1인 경우), file_close 함수를 호출하여 열었던 파일을 닫습니다. 이는 메모리 누수를 방지하기 위한 처리입니다.
return fd;: 파일 디스크립터 값을 반환합니다. 이는 파일이 성공적으로 열렸을 경우 해당 파일에 대한 파일 디스크립터를 반환하는 것을 의미합니다.
따라서, 위의 open 함수는 주어진 파일 경로를 이용하여 파일을 열고, 파일이 성공적으로 열리면 파일에 대한 파일 디스크립터 값을 반환하는 역할을 수행합니다.
int process_add_file(struct file *f) {
struct thread *cur = thread_current();
struct file **fdt = cur->fdt;
//범위를 벗어나지 않고 인덱스에 값이 존재하지 않을 때까지
while(cur->next_fd < FDT_COUNT_LIMIT && fdt[cur->next_fd]!= NULL) {
cur->next_fd++;
}
if(cur->next_fd == FDT_COUNT_LIMIT) { //범위를 넘어설 때까지 남은 공간이 없으면
return -1;
}
fdt[cur->next_fd] = f;
return cur->next_fd;
}
process_add_file 함수는 주어진 파일 구조체(struct file *f)를 현재 스레드의 파일 디스크립터 테이블(fdt)에 추가하는 역할을 수행합니다. 함수의 동작은 다음과 같습니다:
struct thread *cur = thread_current();: 현재 스레드를 나타내는 구조체 포인터 cur을 얻습니다.
struct file **fdt = cur->fdt;: 현재 스레드의 파일 디스크립터 테이블을 나타내는 이중 포인터 fdt를 얻습니다. 파일 디스크립터 테이블은 현재 스레드의 구조체 내에 정의되어 있습니다.
while(cur->next_fd < FDT_COUNT_LIMIT && fdt[cur->next_fd]!= NULL) { cur->next_fd++; }: 현재 스레드의 다음 파일 디스크립터 인덱스(next_fd)가 파일 디스크립터 테이블의 범위 내에 있고, 해당 인덱스에 이미 값이 할당되어 있는 경우, 인덱스를 증가시킵니다. 이는 다음으로 사용 가능한 파일 디스크립터 인덱스를 찾는 과정입니다.
if(cur->next_fd == FDT_COUNT_LIMIT) { return -1; }: 파일 디스크립터 테이블이 가득 찬 경우(모든 파일 디스크립터 인덱스가 할당된 경우), -1을 반환하고 함수를 종료합니다. 이는 파일 디스크립터를 추가할 수 있는 공간이 부족한 경우를 나타냅니다.
fdt[cur->next_fd] = f;: 파일 디스크립터 테이블의 다음 파일 디스크립터 인덱스에 주어진 파일 구조체를 할당합니다. 이는 해당 인덱스에 파일에 대한 정보를 저장하는 것을 의미합니다.
return cur->next_fd;: 파일이 성공적으로 파일 디스크립터 테이블에 추가되었을 경우, 해당 파일에 대한 파일 디스크립터 인덱스를 반환합니다. 이 값은 open 함수에서 호출된 process_add_file 함수에 의해 반환된 파일 디스크립터 값을 가리킵니다.
따라서, process_add_file 함수는 주어진 파일 구조체를 파일 디스크립터 테이블에 추가하고, 해당 파일에 대한 파일 디스크립터 값을 반환하는 역할을 수행합니다.
최근에 제대로 잠을 못잔서 오늘은 조금 쉬엄쉬엄했더니 공부를 많이 못했습니다ㅠㅠ...
내일부터는 다시 좋은 컨디션으로 공부할 수 있도록 해보겠습니다!