⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 file.c

📁 美国mit操作系统课程所用的一个教学操作系统xv6
💻 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 + -