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