μμ€ν
μ½μ μ μ νλ‘κ·Έλ¨μ΄ 컀λμκ² μμ
μ μμ²νλ 창ꡬμ
λλ€.
μλ₯Ό λ€μ΄, μ¬μ©μκ° open("file.txt")λΌκ³ μμ±νλ©΄ μ΄λ "μ΄ νμΌμ μ΄μ΄λ¬λΌ"λ μμ²μ΄λ©°,
컀λμ μμ€ν
μ½μ ν΅ν΄ μ΄λ₯Ό μ²λ¦¬ν©λλ€.
PintOSμμλ sys_create, sys_open, sys_close λ±μ ν¨μλ₯Ό ν΅ν΄ μ΄ μμ²λ€μ μ²λ¦¬ν©λλ€.
| μμ€ν μ½ | μ€λͺ |
|---|---|
create(const char *file, unsigned initial_size) | μ νμΌμ μμ±ν©λλ€. νμΌ μ΄λ¦μ΄ μ€λ³΅λλ©΄ μ€ν¨ν μ μμ΅λλ€. |
open(const char *file) | νμΌμ μ΄κ³ , ν΄λΉ νμΌμ μλ³νλ λ²νΈ(fd)λ₯Ό λ°νν©λλ€. |
close(int fd) | μ΄λ € μλ νμΌμ λ«κ³ κ΄λ ¨ μμμ μ 리ν©λλ€. |
fdλ "νμΌ λμ€ν¬λ¦½ν°(File Descriptor)"μ μ€μλ§λ‘, μ΄μ체μ κ° νμΌμ μΆμνλ μ«μλ‘ νννλ λ°©μμ
λλ€.
νμΌμ μ§μ λ€λ£¨μ§ μκ³ λ ν΄λΉ μ«μλ§μΌλ‘ μ κ·Όν μ μλλ‘ ν©λλ€.
| λ²νΈ | μλ―Έ |
|---|---|
| 0 | νμ€ μ λ ₯(stdin) |
| 1 | νμ€ μΆλ ₯(stdout) |
| 2 μ΄μ | μ¬μ©μκ° openν νμΌμ λ²νΈ |
μλ₯Ό λ€μ΄, open("a.txt")λ₯Ό νΈμΆνλ©΄ λ΄λΆμ μΌλ‘ fd = 2μ κ°μ΄ λ²νΈκ° λΆμ¬λκ³ , μ΄νμλ μ΄ λ²νΈλ‘ νμΌμ μ½κ±°λ μΈ μ μμ΅λλ€.
κ° νλ‘μΈμ€λ μμ λ§μ fd_tableμ κ°μ§κ³ μμ΅λλ€. μ΄ λ°°μ΄μ νλ‘μΈμ€κ° μ΄μ΄ λμ νμΌλ€μ μΆμ νλ λ° μ¬μ©λ©λλ€.
#define FD_MAX 128
struct thread {
...
struct file *fd_table[FD_MAX];
int next_fd; // fdλ 2λΆν° μμ
...
};
open()μ νΈμΆνλ©΄ next_fd μ리λΆν° λΉ μ¬λ‘―μ μ°Ύμ ν΄λΉ μμΉμ νμΌμ μ μ₯ν©λλ€.close(fd)λ₯Ό νΈμΆνλ©΄ ν΄λΉ fd μμΉμ νμΌμ λ«κ³ NULLλ‘ μ΄κΈ°νν©λλ€.create("diary.txt", 0);
"diary.txt"λ₯Ό μμ±ν©λλ€.0μ νμΌμ μ΄κΈ° ν¬κΈ°μ
λλ€.fileμ΄ NULLμ΄λΌλ©΄ sys_exit(-1)μ νΈμΆνμ¬ μ¦μ μ’
λ£ν΄μΌ ν©λλ€.int fd = open("diary.txt");
"diary.txt"λ₯Ό μ΄κ³ , νμΌ λμ€ν¬λ¦½ν°λ₯Ό λ°νν©λλ€.fd_table[fd] μμΉμ μ μ₯λλ©°, νλ‘μΈμ€λ ν΄λΉ λ²νΈλ‘ νμΌμ λ€λ£Ήλλ€.close(fd);
fdκ° μ ν¨νμ§ μκ±°λ ν΄λΉ μμΉμ νμΌμ΄ μλ€λ©΄ μ무 μμ
λ νμ§ μμ΅λλ€.νμΌ μμ€ν
μ μ¬λ¬ μ€λ λκ° λμμ μ κ·Όν μ μλ 곡μ μμμ΄λ―λ‘, λκΈ°νκ° νμν©λλ€.
νμΌμ μ΄κ±°λ λ«λ λμ€ λ€λ₯Έ μ€λ λκ° κ°μ
νλ©΄ μνκ° κΌ¬μΌ μ μκΈ° λλ¬Έμ, file_lockμ΄λΌλ μ μ λ½μ μ¬μ©νμ¬ μκ³ κ΅¬μμ 보νΈν©λλ€.
lock_acquire(&file_lock);
filesys_open(file);
lock_release(&file_lock);
νλ‘μΈμ€κ° μ’
λ£λ λ close()λ₯Ό μ§μ νΈμΆνμ§ μμλλΌλ, process_exit() νΉμ process_cleanup() λ΄μμ λͺ¨λ μ΄λ¦° νμΌλ€μ μ λ¦¬ν΄ μ£Όμ΄μΌ ν©λλ€.
for (int i = 2; i < FD_MAX; i++) {
if (fd_table[i] != NULL) {
file_close(fd_table[i]);
fd_table[i] = NULL;
}
}
[ μ μ νλ‘κ·Έλ¨ ] β [ PintOS 컀λ ]
open("a.txt") β syscall_entry() β syscall_handler()
β
sys_open()
β
filesys_open()
β
fd_table[next_fd] = file*
struct threadμ fd_table[]κ³Ό next_fd νλ μΆκ°sys_create()μμ filesys_create() νΈμΆ λ° NULL κ²μ¬sys_open()μμ filesys_open() νΈμΆ, μ€ν¨ μ -1 λ°νsys_close()μμ file_close() νΈμΆ λ° fd_table μ 리file_lockμ μ μμΌλ‘ μ μΈνκ³ λͺ¨λ νμΌ μμ
μ μ μ©process_exit()μμ μ΄λ¦° νμΌ μ 체 μννμ¬ λ«κΈ°syscall_handler()μ SYS_CREATE, SYS_OPEN, SYS_CLOSE case λ±λ‘