?? fcntl.c
字號:
/** linux/fs/fcntl.c** (C) 1991 Linus Torvalds*/#include <string.h> // 字符串頭文件。主要定義了一些有關字符串操作的嵌入函數。#include <errno.h> // 錯誤號頭文件。包含系統中各種出錯號。(Linus 從minix 中引進的)。#include <linux/sched.h> // 調度程序頭文件,定義了任務結構task_struct、初始任務0 的數據,// 還有一些有關描述符參數設置和獲取的嵌入式匯編函數宏語句。#include <linux/kernel.h> // 內核頭文件。含有一些內核常用函數的原形定義。#include <asm/segment.h> // 段操作頭文件。定義了有關段寄存器操作的嵌入式匯編函數。#include <fcntl.h> // 文件控制頭文件。用于文件及其描述符的操作控制常數符號的定義。#include <sys/stat.h> // 文件狀態頭文件。含有文件或文件系統狀態結構stat{}和常量。extern int sys_close (int fd); // 關閉文件系統調用。(fs/open.c, 192)//// 復制文件句柄(描述符)。// 參數fd 是欲復制的文件句柄,arg 指定新文件句柄的最小數值。// 返回新文件句柄或出錯碼。static intdupfd (unsigned int fd, unsigned int arg){// 如果文件句柄值大于一個程序最多打開文件數NR_OPEN,或者該句柄的文件結構不存在,則出錯,// 返回出錯碼并退出。 if (fd >= NR_OPEN || !current->filp[fd]) return -EBADF;// 如果指定的新句柄值arg 大于最多打開文件數,則出錯,返回出錯碼并退出。 if (arg >= NR_OPEN) return -EINVAL;// 在當前進程的文件結構指針數組中尋找索引號大于等于arg 但還沒有使用的項。 while (arg < NR_OPEN) if (current->filp[arg]) arg++; else break;// 如果找到的新句柄值arg 大于最多打開文件數,則出錯,返回出錯碼并退出。 if (arg >= NR_OPEN) return -EMFILE;// 在執行時關閉標志位圖中復位該句柄位。也即在運行exec()類函數時不關閉該句柄。 current->close_on_exec &= ~(1 << arg);// 令該文件結構指針等于原句柄fd 的指針,并將文件引用計數增1。 (current->filp[arg] = current->filp[fd])->f_count++; return arg; // 返回新的文件句柄。}//// 復制文件句柄系統調用函數。// 復制指定文件句柄oldfd,新句柄值等于newfd。如果newfd 已經打開,則首先關閉之。intsys_dup2 (unsigned int oldfd, unsigned int newfd){ sys_close (newfd); // 若句柄newfd 已經打開,則首先關閉之。 return dupfd (oldfd, newfd); // 復制并返回新句柄。}//// 復制文件句柄系統調用函數。// 復制指定文件句柄oldfd,新句柄的值是當前最小的未用句柄。intsys_dup (unsigned int fildes){ return dupfd (fildes, 0);}//// 文件控制系統調用函數。// 參數fd 是文件句柄,cmd 是操作命令(參見include/fcntl.h,23-30 行)。intsys_fcntl (unsigned int fd, unsigned int cmd, unsigned long arg){ struct file *filp;// 如果文件句柄值大于一個進程最多打開文件數NR_OPEN,或者該句柄的文件結構指針為空,則出錯,// 返回出錯碼并退出。 if (fd >= NR_OPEN || !(filp = current->filp[fd])) return -EBADF;// 根據不同命令cmd 進行分別處理。 switch (cmd) { case F_DUPFD: // 復制文件句柄。 return dupfd (fd, arg); case F_GETFD: // 取文件句柄的執行時關閉標志。 return (current->close_on_exec >> fd) & 1; case F_SETFD: // 設置句柄執行時關閉標志。arg 位0 置位是設置,否則關閉。 if (arg & 1) current->close_on_exec |= (1 << fd); else current->close_on_exec &= ~(1 << fd); return 0; case F_GETFL: // 取文件狀態標志和訪問模式。 return filp->f_flags; case F_SETFL: // 設置文件狀態和訪問模式(根據arg 設置添加、非阻塞標志)。 filp->f_flags &= ~(O_APPEND | O_NONBLOCK); filp->f_flags |= arg & (O_APPEND | O_NONBLOCK); return 0; case F_GETLK: case F_SETLK: case F_SETLKW: // 未實現。 return -1; default: return -1; }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -