15.html
来自「linux 0.11中文版 有注释」· HTML 代码 · 共 355 行 · 第 1/3 页
HTML
355 行
<html>
<head>
<title>fs/open.c</title>
<meta name='robots' content='noindex,nofollow'>
<meta name='generator' content='GLOBAL-5.4.1'>
</head>
<body text='#191970' bgcolor='#f5f5dc' vlink='gray'>
<a name='TOP'><h2><a href='../mains.html'>root</a>/<a href='../files/98.html'>fs</a>/open.c</h2>
<i><font color='green'>/* [<][>]<a href='#L22'>[^]</a><a href='#L299'>[v]</a>[top]<a href='#BOTTOM'>[bottom]</a><a href='../mains.html'>[index]</a><a href='../help.html'>[help]</a> */</font></i>
<hr>
<h2>DEFINITIONS</h2>
This source file includes following definitions.
<ol>
<li><a href='#L22' title='Defined at 22.'>sys_ustat</a>
<li><a href='#L32' title='Defined at 32.'>sys_utime</a>
<li><a href='#L70' title='Defined at 70.'>sys_access</a>
<li><a href='#L114' title='Defined at 114.'>sys_chdir</a>
<li><a href='#L137' title='Defined at 137.'>sys_chroot</a>
<li><a href='#L160' title='Defined at 160.'>sys_chmod</a>
<li><a href='#L185' title='Defined at 185.'>sys_chown</a>
<li><a href='#L214' title='Defined at 214.'>sys_open</a>
<li><a href='#L290' title='Defined at 290.'>sys_creat</a>
<li><a href='#L299' title='Defined at 299.'>sys_close</a>
</ol>
<hr>
<pre>
<a name='L1'><i><font color='green'>/*</font></i>
<a name='L2'><i><font color='green'>* linux/fs/open.c</font></i>
<a name='L3'><i><font color='green'>*</font></i>
<a name='L4'><i><font color='green'>* (C) 1991 Linus Torvalds</font></i>
<a name='L5'><i><font color='green'>*/</font></i>
<a name='L6'>
<a name='L7'><font color='darkred'>#include</font> <<a href='42.html'>string.h</a>> <i><font color='green'>// 字符串头文件。主要定义了一些有关字符串操作的嵌入函数。</font></i>
<a name='L8'><font color='darkred'>#include</font> <<a href='28.html'>errno.h</a>> <i><font color='green'>// 错误号头文件。包含系统中各种出错号。(Linus 从minix 中引进的)。</font></i>
<a name='L9'><font color='darkred'>#include</font> <<a href='29.html'>fcntl.h</a>> <i><font color='green'>// 文件控制头文件。用于文件及其描述符的操作控制常数符号的定义。</font></i>
<a name='L10'><font color='darkred'>#include</font> <<a href='45.html'>sys/types.h</a>> <i><font color='green'>// 类型头文件。定义了基本的系统数据类型。</font></i>
<a name='L11'><font color='darkred'>#include</font> <<a href='51.html'>utime.h</a>> <i><font color='green'>// 用户时间头文件。定义了访问和修改时间结构以及utime()原型。</font></i>
<a name='L12'><font color='darkred'>#include</font> <<a href='43.html'>sys/stat.h</a>> <i><font color='green'>// 文件状态头文件。含有文件或文件系统状态结构stat{}和常量。</font></i>
<a name='L13'>
<a name='L14'><font color='darkred'>#include</font> <<a href='36.html'>linux/sched.h</a>> <i><font color='green'>// 调度程序头文件,定义了任务结构task_struct、初始任务0 的数据,</font></i>
<a name='L15'><i><font color='green'>// 还有一些有关描述符参数设置和获取的嵌入式汇编函数宏语句。</font></i>
<a name='L16'><font color='darkred'>#include</font> <<a href='38.html'>linux/tty.h</a>> <i><font color='green'>// tty 头文件,定义了有关tty_io,串行通信方面的参数、常数。</font></i>
<a name='L17'><font color='darkred'>#include</font> <<a href='34.html'>linux/kernel.h</a>> <i><font color='green'>// 内核头文件。含有一些内核常用函数的原形定义。</font></i>
<a name='L18'><font color='darkred'>#include</font> <<a href='24.html'>asm/segment.h</a>> <i><font color='green'>// 段操作头文件。定义了有关段寄存器操作的嵌入式汇编函数。</font></i>
<a name='L19'>
<a name='L20'><i><font color='green'>// 取文件系统信息系统调用函数。</font></i>
<a name='L21'><b>int</b>
<a name='L22'><a href='../R/694.html' title='Multiple refered from 2 places.'>sys_ustat</a> (<b>int</b> dev, <b>struct</b> ustat *ubuf)
<a name='L23'><font color='red'>{</font>
<a name='L24'> <b>return</b> -<a href='../S/28.html#L67' title='Defined at 67 in include/errno.h.'>ENOSYS</a>;
<a name='L25'><font color='red'>}</font>
<a name='L26'>
<a name='L27'><i><font color='green'>//// 设置文件访问和修改时间。</font></i>
<a name='L28'><i><font color='green'>// 参数filename 是文件名,times 是访问和修改时间结构指针。</font></i>
<a name='L29'><i><font color='green'>// 如果times 指针不为NULL,则取utimbuf 结构中的时间信息来设置文件的访问和修改时间。如果</font></i>
<a name='L30'><i><font color='green'>// times 指针是NULL,则取系统当前时间来设置指定文件的访问和修改时间域。</font></i>
<a name='L31'><b>int</b>
<a name='L32'><a href='../R/695.html' title='Multiple refered from 2 places.'>sys_utime</a> (<b>char</b> *filename, <b>struct</b> utimbuf *times)
<a name='L33'><font color='red'>{</font>
<a name='L34'> <b>struct</b> m_inode *inode;
<a name='L35'> <b>long</b> actime, modtime;
<a name='L36'>
<a name='L37'><i><font color='green'>// 根据文件名寻找对应的i 节点,如果没有找到,则返回出错码。</font></i>
<a name='L38'> <b>if</b> (!(inode = <a href='../S/14.html#L470' title='Defined at 470 in fs/namei.c.'>namei</a> (filename)))
<a name='L39'> <b>return</b> -<a href='../S/28.html#L31' title='Defined at 31 in include/errno.h.'>ENOENT</a>;
<a name='L40'><i><font color='green'>// 如果访问和修改时间数据结构指针不为NULL,则从结构中读取用户设置的时间值。</font></i>
<a name='L41'> <b>if</b> (times)
<a name='L42'> <font color='red'>{</font>
<a name='L43'> actime = <a href='../S/24.html#L32' title='Defined at 32 in include/asm/segment.h.'>get_fs_long</a> ((<b>unsigned</b> <b>long</b> *) &times->actime);
<a name='L44'> modtime = <a href='../S/24.html#L32' title='Defined at 32 in include/asm/segment.h.'>get_fs_long</a> ((<b>unsigned</b> <b>long</b> *) &times->modtime);
<a name='L45'><i><font color='green'>// 否则将访问和修改时间置为当前时间。</font></i>
<a name='L46'> <font color='red'>}</font>
<a name='L47'> <b>else</b>
<a name='L48'> actime = modtime = <a href='../S/36.html#L234' title='Defined at 234 in include/linux/sched.h.'>CURRENT_TIME</a>;
<a name='L49'><i><font color='green'>// 修改i 节点中的访问时间字段和修改时间字段。</font></i>
<a name='L50'> inode->i_atime = actime;
<a name='L51'> inode->i_mtime = modtime;
<a name='L52'><i><font color='green'>// 置i 节点已修改标志,释放该节点,并返回0。</font></i>
<a name='L53'> inode->i_dirt = 1;
<a name='L54'> <a href='../S/12.html#L221' title='Defined at 221 in fs/inode.c.'>iput</a> (inode);
<a name='L55'> <b>return</b> 0;
<a name='L56'><font color='red'>}</font>
<a name='L57'>
<a name='L58'><i><font color='green'>/*</font></i>
<a name='L59'><i><font color='green'>* XXX should we use the real or effective uid? BSD uses the real uid,</font></i>
<a name='L60'><i><font color='green'>* so as to make this call useful to setuid programs.</font></i>
<a name='L61'><i><font color='green'>*/</font></i>
<a name='L62'><i><font color='green'>/*</font></i>
<a name='L63'><i><font color='green'>* 文件属性XXX,我们该用真实用户id 还是有效用户id?BSD 系统使用了真实用户id,</font></i>
<a name='L64'><i><font color='green'>* 以使该调用可以供setuid 程序使用。(注:POSIX 标准建议使用真实用户ID)</font></i>
<a name='L65'><i><font color='green'>*/</font></i>
<a name='L66'><i><font color='green'>//// 检查对文件的访问权限。</font></i>
<a name='L67'><i><font color='green'>// 参数filename 是文件名,mode 是屏蔽码,由R_OK(4)、W_OK(2)、X_OK(1)和F_OK(0)组成。</font></i>
<a name='L68'><i><font color='green'>// 如果请求访问允许的话,则返回0,否则返回出错码。</font></i>
<a name='L69'><b>int</b>
<a name='L70'><a href='../R/628.html' title='Multiple refered from 2 places.'>sys_access</a> (<b>const</b> <b>char</b> *filename, <b>int</b> mode)
<a name='L71'><font color='red'>{</font>
<a name='L72'> <b>struct</b> m_inode *inode;
<a name='L73'> <b>int</b> res, i_mode;
<a name='L74'>
<a name='L75'><i><font color='green'>// 屏蔽码由低3 位组成,因此清除所有高比特位。</font></i>
<a name='L76'> mode &= 0007;
<a name='L77'><i><font color='green'>// 如果文件名对应的i 节点不存在,则返回出错码。</font></i>
<a name='L78'> <b>if</b> (!(inode = <a href='../S/14.html#L470' title='Defined at 470 in fs/namei.c.'>namei</a> (filename)))
<a name='L79'> <b>return</b> -<a href='../S/28.html#L42' title='Defined at 42 in include/errno.h.'>EACCES</a>;
<a name='L80'><i><font color='green'>// 取文件的属性码,并释放该i 节点。</font></i>
<a name='L81'> i_mode = res = inode->i_mode & 0777;
<a name='L82'> <a href='../S/12.html#L221' title='Defined at 221 in fs/inode.c.'>iput</a> (inode);
<a name='L83'><i><font color='green'>// 如果当前进程是该文件的宿主,则取文件宿主属性。</font></i>
<a name='L84'> <b>if</b> (current->uid == inode->i_uid)
<a name='L85'> res >>= 6;
<a name='L86'><i><font color='green'>// 否则如果当前进程是与该文件同属一组,则取文件组属性。</font></i>
<a name='L87'> <b>else</b> <b>if</b> (current->gid == inode->i_gid)
<a name='L88'> res >>= 6;
<a name='L89'><i><font color='green'>// 如果文件属性具有查询的属性位,则访问许可,返回0。</font></i>
<a name='L90'> <b>if</b> ((res & 0007 & mode) == mode)
<a name='L91'> <b>return</b> 0;
<a name='L92'><i><font color='green'>/*</font></i>
<a name='L93'><i><font color='green'>* XXX we are doing this test last because we really should be</font></i>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?