📄 file.c
字号:
#include "types.h"#include "defs.h"#include "param.h"#include "file.h"#include "spinlock.h"#include "dev.h"struct devsw devsw[NDEV];struct spinlock file_table_lock;struct file file[NFILE];voidfileinit(void){ initlock(&file_table_lock, "file_table");}// Allocate a file structure.struct file*filealloc(void){ int i; acquire(&file_table_lock); for(i = 0; i < NFILE; i++){ if(file[i].type == FD_CLOSED){ file[i].type = FD_NONE; file[i].ref = 1; release(&file_table_lock); return file + i; } } release(&file_table_lock); return 0;}// Increment ref count for file f.struct file*filedup(struct file *f){ acquire(&file_table_lock); if(f->ref < 1 || f->type == FD_CLOSED) panic("filedup"); f->ref++; release(&file_table_lock); return f;}// Close file f. (Decrement ref count, close when reaches 0.)voidfileclose(struct file *f){ struct file ff; acquire(&file_table_lock); if(f->ref < 1 || f->type == FD_CLOSED) panic("fileclose"); if(--f->ref > 0){ release(&file_table_lock); return; } ff = *f; f->ref = 0; f->type = FD_CLOSED; release(&file_table_lock); if(ff.type == FD_PIPE) pipeclose(ff.pipe, ff.writable); else if(ff.type == FD_INODE) iput(ff.ip); else panic("fileclose");}// Get metadata about file f.intfilestat(struct file *f, struct stat *st){ if(f->type == FD_INODE){ ilock(f->ip); stati(f->ip, st); iunlock(f->ip); return 0; } return -1;}// Read from file f. Addr is kernel address.intfileread(struct file *f, char *addr, int n){ int r; if(f->readable == 0) return -1; if(f->type == FD_PIPE) return piperead(f->pipe, addr, n); if(f->type == FD_INODE){ ilock(f->ip); if((r = readi(f->ip, addr, f->off, n)) > 0) f->off += r; iunlock(f->ip); return r; } panic("fileread");}// Write to file f. Addr is kernel address.intfilewrite(struct file *f, char *addr, int n){ int r; if(f->writable == 0) return -1; if(f->type == FD_PIPE) return pipewrite(f->pipe, addr, n); if(f->type == FD_INODE){ ilock(f->ip); if((r = writei(f->ip, addr, f->off, n)) > 0) f->off += r; iunlock(f->ip); return r; } panic("filewrite");}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -