亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? open.c

?? LINUX 0.11版內核代碼。 并有代碼分析說明。
?? C
字號:
/* passed *  linux/fs/open.c * *  (C) 1991  Linus Torvalds */#include <set_seg.h>
#include <string.h>// 字符串頭文件。主要定義了一些有關字符串操作的嵌入函數。#include <errno.h>// 錯誤號頭文件。包含系統中各種出錯號。(Linus 從minix 中引進的)。#include <fcntl.h>// 文件控制頭文件。用于文件及其描述符的操作控制常數符號的定義。#include <sys/types.h>// 類型頭文件。定義了基本的系統數據類型。#include <utime.h>// 用戶時間頭文件。定義了訪問和修改時間結構以及utime()原型。#include <sys/stat.h>// 文件狀態頭文件。含有文件或文件系統狀態結構stat{}和常量。#include <linux/sched.h>// 調度程序頭文件,定義了任務結構task_struct、初始任務0 的數據,
						// 還有一些有關描述符參數設置和獲取的嵌入式匯編函數宏語句。#include <linux/tty.h>// tty 頭文件,定義了有關tty_io,串行通信方面的參數、常數。#include <linux/kernel.h>// 內核頭文件。含有一些內核常用函數的原形定義。#include <asm/segment.h>// 段操作頭文件。定義了有關段寄存器操作的嵌入式匯編函數。
// 取文件系統信息系統調用函數。int sys_ustat(int dev, struct ustat * ubuf){	return -ENOSYS;}
//// 設置文件訪問和修改時間。
// 參數filename 是文件名,times 是訪問和修改時間結構指針。
// 如果times 指針不為NULL,則取utimbuf 結構中的時間信息來設置文件的訪問和修改時間。如果
// times 指針是NULL,則取系統當前時間來設置指定文件的訪問和修改時間域。int sys_utime(char * filename, struct utimbuf * times){	struct m_inode * inode;	long actime,modtime;
// 根據文件名尋找對應的i 節點,如果沒有找到,則返回出錯碼。	if (!(inode=namei(filename)))		return -ENOENT;
// 如果訪問和修改時間數據結構指針不為NULL,則從結構中讀取用戶設置的時間值。	if (times) {		actime = get_fs_long((unsigned long *) &times->actime);		modtime = get_fs_long((unsigned long *) &times->modtime);
// 否則將訪問和修改時間置為當前時間。	} else		actime = modtime = CURRENT_TIME;
// 修改i 節點中的訪問時間字段和修改時間字段。	inode->i_atime = actime;	inode->i_mtime = modtime;
// 置i 節點已修改標志,釋放該節點,并返回0。	inode->i_dirt = 1;	iput(inode);	return 0;}/* * 文件屬性XXX,我們該用真實用戶id 還是有效用戶id?BSD 系統使用了真實用戶id,
 * 以使該調用可以供setuid 程序使用。(注:POSIX 標準建議使用真實用戶ID) */
//// 檢查對文件的訪問權限。
// 參數filename 是文件名,mode 是屏蔽碼,由R_OK(4)、W_OK(2)、X_OK(1)和F_OK(0)組成。
// 如果請求訪問允許的話,則返回0,否則返回出錯碼。int sys_access(const char * filename,int mode){	struct m_inode * inode;	int res, i_mode;
// 屏蔽碼由低3 位組成,因此清除所有高比特位。	mode &= 0007;
// 如果文件名對應的i 節點不存在,則返回出錯碼。	if (!(inode=namei(filename)))		return -EACCES;
// 取文件的屬性碼,并釋放該i 節點。	i_mode = res = inode->i_mode & 0777;	iput(inode);
// 如果當前進程是該文件的宿主,則取文件宿主屬性。	if (current->uid == inode->i_uid)		res >>= 6;
// 否則如果當前進程是與該文件同屬一組,則取文件組屬性。	else if (current->gid == inode->i_gid)		res >>= 6;
// 如果文件屬性具有查詢的屬性位,則訪問許可,返回0。	if ((res & 0007 & mode) == mode)		return 0;/* * XXX 我們最后才做下面的測試,因為我們實際上需要交換有效用戶id 和
 * 真實用戶id(臨時地),然后才調用suser()函數。如果我們確實要調用
 * suser()函數,則需要最后才被調用。  */
// 如果當前用戶id 為0(超級用戶)并且屏蔽碼執行位是0 或文件可以被任何人訪問,則返回0。	if ((!current->uid) &&	    (!(mode & 1) || (i_mode & 0111)))		return 0;
	// 否則返回出錯碼。	return -EACCES;}
//// 改變當前工作目錄系統調用函數。
// 參數filename 是目錄名。
// 操作成功則返回0,否則返回出錯碼。int sys_chdir(const char * filename){	struct m_inode * inode;
// 如果文件名對應的i 節點不存在,則返回出錯碼。	if (!(inode = namei(filename)))		return -ENOENT;
// 如果該i 節點不是目錄的i 節點,則釋放該節點,返回出錯碼。	if (!S_ISDIR(inode->i_mode)) {		iput(inode);		return -ENOTDIR;	}
// 釋放當前進程原工作目錄i 節點,并指向該新置的工作目錄i 節點。返回0。	iput(current->pwd);	current->pwd = inode;	return (0);}
//// 改變根目錄系統調用函數。
// 將指定的路徑名改為根目錄'/'。
// 如果操作成功則返回0,否則返回出錯碼。int sys_chroot(const char * filename){	struct m_inode * inode;
// 如果文件名對應的i 節點不存在,則返回出錯碼。	if (!(inode=namei(filename)))		return -ENOENT;
// 如果該i 節點不是目錄的i 節點,則釋放該節點,返回出錯碼。	if (!S_ISDIR(inode->i_mode)) {		iput(inode);		return -ENOTDIR;	}
// 釋放當前進程的根目錄i 節點,并重置為這里指定目錄名的i 節點,返回0。	iput(current->root);	current->root = inode;	return (0);}
//// 修改文件屬性系統調用函數。
// 參數filename 是文件名,mode 是新的文件屬性。
// 若操作成功則返回0,否則返回出錯碼。int sys_chmod(const char * filename,int mode){	struct m_inode * inode;
// 如果文件名對應的i 節點不存在,則返回出錯碼。
	if (!(inode=namei(filename)))		return -ENOENT;
// 如果當前進程的有效用戶id 不等于文件i 節點的用戶id,并且當前進程不是超級用戶,則釋放該
// 文件i 節點,返回出錯碼。	if ((current->euid != inode->i_uid) && !suser()) {		iput(inode);		return -EACCES;	}
// 重新設置i 節點的文件屬性,并置該i 節點已修改標志。釋放該i 節點,返回0。	inode->i_mode = (mode & 07777) | (inode->i_mode & ~07777);	inode->i_dirt = 1;	iput(inode);	return 0;}
//// 修改文件宿主系統調用函數。
// 參數filename 是文件名,uid 是用戶標識符(用戶id),gid 是組id。
// 若操作成功則返回0,否則返回出錯碼。int sys_chown(const char * filename,int uid,int gid){	struct m_inode * inode;
// 如果文件名對應的i 節點不存在,則返回出錯碼。	if (!(inode=namei(filename)))		return -ENOENT;
// 若當前進程不是超級用戶,則釋放該i 節點,返回出錯碼。	if (!suser()) {		iput(inode);		return -EACCES;	}
// 設置文件對應i 節點的用戶id 和組id,并置i 節點已經修改標志,釋放該i 節點,返回0。	inode->i_uid=uid;	inode->i_gid=gid;	inode->i_dirt=1;	iput(inode);	return 0;}
//// 打開(或創建)文件系統調用函數。
// 參數filename 是文件名,flag 是打開文件標志:只讀O_RDONLY、只寫O_WRONLY 或讀寫O_RDWR,
// 以及O_CREAT、O_EXCL、O_APPEND 等其它一些標志的組合,若本函數創建了一個新文件,則mode
// 用于指定使用文件的許可屬性,這些屬性有S_IRWXU(文件宿主具有讀、寫和執行權限)、S_IRUSR
// (用戶具有讀文件權限)、S_IRWXG(組成員具有讀、寫和執行權限)等等。對于新創建的文件,這些
// 屬性只應用于將來對文件的訪問,創建了只讀文件的打開調用也將返回一個可讀寫的文件句柄。
// 若操作成功則返回文件句柄(文件描述符),否則返回出錯碼。(參見sys/stat.h, fcntl.h)int sys_open(const char * filename,int flag,int mode){	struct m_inode * inode;	struct file * f;	int i,fd;
// 將用戶設置的模式與進程的模式屏蔽碼相與,產生許可的文件模式。	mode &= 0777 & ~current->umask;
// 搜索進程結構中文件結構指針數組,查找一個空閑項,若已經沒有空閑項,則返回出錯碼。	for(fd=0 ; fd<NR_OPEN ; fd++)		if (!current->filp[fd])			break;	if (fd>=NR_OPEN)		return -EINVAL;
// 設置執行時關閉文件句柄位圖,復位對應比特位。	current->close_on_exec &= ~(1<<fd);
// 令f 指向文件表數組開始處。搜索空閑文件結構項(句柄引用計數為0 的項),若已經沒有空閑
// 文件表結構項,則返回出錯碼。	f=0+file_table;	for (i=0 ; i<NR_FILE ; i++,f++)		if (!f->f_count) break;	if (i>=NR_FILE)		return -EINVAL;
// 讓進程的對應文件句柄的文件結構指針指向搜索到的文件結構,并令句柄引用計數遞增1。	(current->filp[fd]=f)->f_count++;
// 調用函數執行打開操作,若返回值小于0,則說明出錯,釋放剛申請到的文件結構,返回出錯碼。	if ((i=open_namei(filename,flag,mode,&inode))<0) {		current->filp[fd]=NULL;		f->f_count=0;		return i;	}/* ttys 有些特殊(ttyxx 主號==4,tty 主號==5)*/
// 如果是字符設備文件,那么如果設備號是4 的話,則設置當前進程的tty 號為該i 節點的子設備號。
// 并設置當前進程tty 對應的tty 表項的父進程組號等于進程的父進程組號。	if (S_ISCHR(inode->i_mode))		if (MAJOR(inode->i_zone[0])==4) {			if (current->leader && current->tty<0) {				current->tty = MINOR(inode->i_zone[0]);				tty_table[current->tty].pgrp = current->pgrp;			}
// 否則如果該字符文件設備號是5 的話,若當前進程沒有tty,則說明出錯,釋放i 節點和申請到的
// 文件結構,返回出錯碼。		} else if (MAJOR(inode->i_zone[0])==5)			if (current->tty<0) {				iput(inode);				current->filp[fd]=NULL;				f->f_count=0;				return -EPERM;			}/* 同樣對于塊設備文件:需要檢查盤片是否被更換 */
// 如果打開的是塊設備文件,則檢查盤片是否更換,若更換則需要是高速緩沖中對應該設備的所有
// 緩沖塊失效。	if (S_ISBLK(inode->i_mode))		check_disk_change(inode->i_zone[0]);
// 初始化文件結構。置文件結構屬性和標志,置句柄引用計數為1,設置i 節點字段,文件讀寫指針
// 初始化為0。返回文件句柄。	f->f_mode = inode->i_mode;	f->f_flags = flag;	f->f_count = 1;	f->f_inode = inode;	f->f_pos = 0;	return (fd);}
//// 創建文件系統調用函數。
// 參數pathname 是路徑名,mode 與上面的sys_open()函數相同。
// 成功則返回文件句柄,否則返回出錯碼。int sys_creat(const char * pathname, int mode){	return sys_open(pathname, O_CREAT | O_TRUNC, mode);}
// 關閉文件系統調用函數。
// 參數fd 是文件句柄。
// 成功則返回0,否則返回出錯碼。int sys_close(unsigned int fd){		struct file * filp;
// 若文件句柄值大于程序同時能打開的文件數,則返回出錯碼。	if (fd >= NR_OPEN)		return -EINVAL;
// 復位進程的執行時關閉文件句柄位圖對應位。	current->close_on_exec &= ~(1<<fd);
// 若該文件句柄對應的文件結構指針是NULL,則返回出錯碼。	if (!(filp = current->filp[fd]))		return -EINVAL;
// 置該文件句柄的文件結構指針為NULL。	current->filp[fd] = NULL;
// 若在關閉文件之前,對應文件結構中的句柄引用計數已經為0,則說明內核出錯,死機。	if (filp->f_count == 0)		panic("Close: file count is 0");
// 否則將對應文件結構的句柄引用計數減1,如果還不為0,則返回0(成功)。若已等于0,說明該
// 文件已經沒有句柄引用,則釋放該文件i 節點,返回0。	if (--filp->f_count)		return (0);	iput(filp->f_inode);	return (0);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产欧美一区二区精品秋霞影院| 国产夫妻精品视频| 欧美激情一区二区三区| 欧美精品乱码久久久久久| 国产精品女同一区二区三区| 国产激情视频一区二区在线观看 | 亚洲成av人片一区二区梦乃| 久久综合九色综合97婷婷| 首页欧美精品中文字幕| 亚洲三级在线免费观看| 国产欧美一区二区精品性色| 欧美变态tickling挠脚心| 欧美日韩午夜在线| 91麻豆文化传媒在线观看| 中文字幕第一区二区| 国产精品成人免费精品自在线观看| 欧美人动与zoxxxx乱| 国产精品亚洲一区二区三区在线| 欧美aaa在线| 人人精品人人爱| 日韩**一区毛片| 秋霞成人午夜伦在线观看| 日本中文字幕一区| 日日夜夜免费精品视频| 亚洲成人av一区| 日韩中文字幕亚洲一区二区va在线| 亚洲综合色噜噜狠狠| 亚洲午夜在线电影| 午夜精品福利视频网站| 在线观看91精品国产麻豆| 成人午夜av影视| 不卡的电视剧免费网站有什么| 中文字幕中文字幕在线一区 | 国产aⅴ综合色| 国产高清精品网站| 91小视频在线| 在线免费不卡视频| 欧美一区二区黄| 久久99国产精品免费| 极品尤物av久久免费看| 国产成人精品综合在线观看 | 亚洲亚洲精品在线观看| 午夜久久电影网| 久久国产尿小便嘘嘘| 国产福利不卡视频| 色视频欧美一区二区三区| 欧美一区二区在线看| 国产欧美一二三区| 亚洲尤物视频在线| 国产一区二区精品在线观看| 日本高清无吗v一区| 99久久国产免费看| 精品日韩一区二区| 久久久久久久久久久电影| 亚洲人成7777| 久久99这里只有精品| 成人高清在线视频| 欧美一区二区三区视频| 亚洲欧洲美洲综合色网| 日韩成人一区二区| av电影天堂一区二区在线| 欧美一区二区三区人| 亚洲日本中文字幕区| 精品一二三四区| 日本道在线观看一区二区| 精品国产凹凸成av人导航| 色综合色狠狠天天综合色| 日韩无一区二区| 欧美视频在线播放| 久久成人免费日本黄色| 成人精品免费看| 欧美一级夜夜爽| 亚洲精品成人天堂一二三| 国产精品丝袜黑色高跟| 久久99精品网久久| 不卡一区二区三区四区| 91精品国产全国免费观看 | 国产日韩欧美麻豆| 亚洲夂夂婷婷色拍ww47| 蜜臀av在线播放一区二区三区| 91国内精品野花午夜精品| 中文字幕第一区综合| 国产专区综合网| 日韩精品一区二区三区老鸭窝| 亚洲尤物在线视频观看| 最新热久久免费视频| 国产精品99久久久久久有的能看| 在线视频一区二区免费| 国产人成亚洲第一网站在线播放| 免费人成精品欧美精品| 欧美日韩综合色| 亚洲三级电影网站| 91理论电影在线观看| 中文字幕制服丝袜成人av| 成人高清伦理免费影院在线观看| 国产午夜精品一区二区三区嫩草 | 人人狠狠综合久久亚洲| 欧美日韩一本到| 亚洲在线观看免费视频| 91一区一区三区| 国产精品久久久久久妇女6080| 国产a区久久久| 亚洲视频一二三| 国产欧美日韩中文久久| 国产福利一区二区三区在线视频| 欧美另类videos死尸| 一区二区成人在线观看| 欧美日韩中字一区| 肉色丝袜一区二区| 欧美成人精品福利| 国产成人av一区二区三区在线观看| 国产偷国产偷亚洲高清人白洁| 国产宾馆实践打屁股91| 成人欧美一区二区三区小说| 91老师片黄在线观看| 亚洲不卡av一区二区三区| 欧美狂野另类xxxxoooo| 久久www免费人成看片高清| 国产日韩成人精品| 色婷婷综合久久久| 轻轻草成人在线| 亚洲国产高清在线观看视频| 日本高清不卡一区| 精品影视av免费| 欧洲国内综合视频| 中文字幕一区二区三区在线观看 | 精品99999| 国产成人精品免费一区二区| 亚洲综合视频在线观看| 欧美一区二区在线播放| 大尺度一区二区| 日韩国产精品大片| 一区二区久久久久久| 欧美一区日韩一区| 99re视频精品| 精品一区二区在线视频| 亚洲综合色噜噜狠狠| 亚洲精品一区二区三区蜜桃下载| 成人免费视频视频| 视频在线观看国产精品| 国产精品成人免费精品自在线观看| 欧美精品高清视频| 99国产精品视频免费观看| 蜜桃精品在线观看| 亚洲国产色一区| 国产精品电影一区二区| 精品久久久久av影院 | 国产欧美日韩另类一区| 欧美日韩中文一区| 成人国产在线观看| 国产一区啦啦啦在线观看| 五月天中文字幕一区二区| 玉足女爽爽91| 国产精品素人视频| 国产亚洲美州欧州综合国 | 欧美一区二区女人| 色久综合一二码| 欧美日韩一级片在线观看| 欧美视频一区二区三区在线观看| 91黄视频在线观看| 欧美人动与zoxxxx乱| 91精品一区二区三区久久久久久| 欧美日韩免费电影| 3atv在线一区二区三区| 欧美一级欧美三级在线观看 | 成人av资源网站| 99久久久无码国产精品| 欧美在线观看视频一区二区三区| 精品视频在线免费| 欧美老肥妇做.爰bbww| 日韩欧美国产麻豆| 欧美激情资源网| 亚洲最大成人综合| 天堂久久一区二区三区| 黄页视频在线91| 99热这里都是精品| 91超碰这里只有精品国产| 久久麻豆一区二区| 亚洲男人的天堂av| 亚洲大片在线观看| 国产一区在线观看视频| 一本大道久久精品懂色aⅴ| 欧美日韩亚洲综合一区二区三区 | 国产成人一区二区精品非洲| www.99精品| 91精品国产综合久久精品麻豆 | 麻豆91免费观看| 成人av午夜电影| 欧美一区二区在线播放| 国产精品理论片| 秋霞av亚洲一区二区三| 成人av电影在线观看| 91精品视频网| 亚洲精品乱码久久久久久久久| 免费欧美在线视频| 在线视频你懂得一区| 国产亚洲一区二区三区在线观看| 一区二区在线看| 成人午夜看片网址| 欧美sm美女调教|