有open就有close,下面来close一个文件。
首先添加用户接口:
kernel/fs.c
- /*-------------------------------------------------------------------------Close
- 根据文件描述符close掉一个文件
- */
- void Close(int fd)
- {
- Message m;
- m.msg_type = FS_CLOSE_FILE;
- m.i1 = fd;
- Send_Receive_Shell(BOTH,PROC_FS_PID,&m); /* 发给文件系统进程 */
- }
在文件系统进程中处理这个消息:
kernel/fs.c
- /* 关闭文件消息,交给Do_Close_File函数处理 */
- case FS_CLOSE_FILE:
- Do_Close_File(&m);
- break;
- /*-----------------------------------------------------------------Do_Close_File
- 根据指定的fd关闭一个文件,包括3项工作
- 把对应的i结点缓冲表中的i结点的shared_count自减1
- 对应的fd全局表的fd的fd_inode字段置0,表示可用
- 调用进程的PCB中的fd指针数组对应项置0,表示可用
- */
- static void Do_Close_File(Message *m)
- {
- PCB *p_caller = &PCB_Table[m->src_proc_pid]; /* 取得调用进程的PCB指针 */
- int fd = m->i1; /* 取得fd */
- Clear_I_Node(p_caller->fd_ptr_table[fd]->fd_inode);
- p_caller->fd_ptr_table[fd]->fd_inode = 0;
- p_caller->fd_ptr_table[fd] = 0;
- }
用到的宏:
include/const.h
- #define FS_OPEN_FILE 6 /* 打开(创建)一个文件 */
- #define FS_CLOSE_FILE 7 /* 关闭一个文件 */
添加声明:
include/proto.h
- /* 打开一个文件,返回文件描述符 */
- int Open(const char *path,int flag);
- /* 根据文件描述符close掉一个文件 */
- void Close(int fd);
验证的事儿就算了,太简单了。。