18.html
来自「linux 0.11中文版 有注释」· HTML 代码 · 共 102 行
HTML
102 行
<html>
<head>
<title>fs/stat.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>/stat.c</h2>
<i><font color='green'>/* [<][>]<a href='#L19'>[^]</a><a href='#L64'>[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='#L19' title='Defined at 19.'>cp_stat</a>
<li><a href='#L47' title='Defined at 47.'>sys_stat</a>
<li><a href='#L64' title='Defined at 64.'>sys_fstat</a>
</ol>
<hr>
<pre>
<a name='L1'><i><font color='green'>/*</font></i>
<a name='L2'><i><font color='green'>* linux/fs/stat.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='28.html'>errno.h</a>> <i><font color='green'>// 错误号头文件。包含系统中各种出错号。(Linus 从minix 中引进的)。</font></i>
<a name='L8'><font color='darkred'>#include</font> <<a href='43.html'>sys/stat.h</a>> <i><font color='green'>// 文件状态头文件。含有文件或文件系统状态结构stat{}和常量。</font></i>
<a name='L9'>
<a name='L10'><font color='darkred'>#include</font> <<a href='31.html'>linux/fs.h</a>> <i><font color='green'>// 文件系统头文件。定义文件表结构(file,buffer_head,m_inode 等)。</font></i>
<a name='L11'><font color='darkred'>#include</font> <<a href='36.html'>linux/sched.h</a>> <i><font color='green'>// 调度程序头文件,定义了任务结构task_struct、初始任务0 的数据,</font></i>
<a name='L12'><i><font color='green'>// 还有一些有关描述符参数设置和获取的嵌入式汇编函数宏语句。</font></i>
<a name='L13'><font color='darkred'>#include</font> <<a href='34.html'>linux/kernel.h</a>> <i><font color='green'>// 内核头文件。含有一些内核常用函数的原形定义。</font></i>
<a name='L14'><font color='darkred'>#include</font> <<a href='24.html'>asm/segment.h</a>> <i><font color='green'>// 段操作头文件。定义了有关段寄存器操作的嵌入式汇编函数。</font></i>
<a name='L15'>
<a name='L16'><i><font color='green'>//// 复制文件状态信息。</font></i>
<a name='L17'><i><font color='green'>// 参数inode 是文件对应的i 节点,statbuf 是stat 文件状态结构指针,用于存放取得的状态信息。</font></i>
<a name='L18'><b>static</b> <b>void</b>
<a name='L19'><a href='../R/415.html' title='Multiple refered from 2 places.'>cp_stat</a> (<b>struct</b> m_inode *inode, <b>struct</b> stat *statbuf)
<a name='L20'><font color='red'>{</font>
<a name='L21'> <b>struct</b> stat tmp;
<a name='L22'> <b>int</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L23'>
<a name='L24'><i><font color='green'>// 首先验证(或分配)存放数据的内存空间。</font></i>
<a name='L25'> <a href='../S/68.html#L34' title='Defined at 34 in kernel/fork.c.'>verify_area</a> (statbuf, <b>sizeof</b> (*statbuf));
<a name='L26'><i><font color='green'>// 然后临时复制相应节点上的信息。</font></i>
<a name='L27'> tmp.st_dev = inode->i_dev; <i><font color='green'>// 文件所在的设备号。</font></i>
<a name='L28'> tmp.st_ino = inode->i_num; <i><font color='green'>// 文件i 节点号。</font></i>
<a name='L29'> tmp.st_mode = inode->i_mode; <i><font color='green'>// 文件属性。</font></i>
<a name='L30'> tmp.st_nlink = inode->i_nlinks; <i><font color='green'>// 文件的连接数。</font></i>
<a name='L31'> tmp.st_uid = inode->i_uid; <i><font color='green'>// 文件的用户id。</font></i>
<a name='L32'> tmp.st_gid = inode->i_gid; <i><font color='green'>// 文件的组id。</font></i>
<a name='L33'> tmp.st_rdev = inode->i_zone[0]; <i><font color='green'>// 设备号(如果文件是特殊的字符文件或块文件)。</font></i>
<a name='L34'> tmp.st_size = inode->i_size; <i><font color='green'>// 文件大小(字节数)(如果文件是常规文件)。</font></i>
<a name='L35'> tmp.st_atime = inode->i_atime; <i><font color='green'>// 最后访问时间。</font></i>
<a name='L36'> tmp.st_mtime = inode->i_mtime; <i><font color='green'>// 最后修改时间。</font></i>
<a name='L37'> tmp.st_ctime = inode->i_ctime; <i><font color='green'>// 最后节点修改时间。</font></i>
<a name='L38'><i><font color='green'>// 最后将这些状态信息复制到用户缓冲区中。</font></i>
<a name='L39'> <b>for</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = 0; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> < <b>sizeof</b> (tmp); <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>++)
<a name='L40'> <a href='../S/24.html#L44' title='Defined at 44 in include/asm/segment.h.'>put_fs_byte</a> (((<b>char</b> *) &tmp)[<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>], &((<b>char</b> *) statbuf)[<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>]);
<a name='L41'><font color='red'>}</font>
<a name='L42'>
<a name='L43'><i><font color='green'>//// 文件状态系统调用函数 - 根据文件名获取文件状态信息。</font></i>
<a name='L44'><i><font color='green'>// 参数filename 是指定的文件名,statbuf 是存放状态信息的缓冲区指针。</font></i>
<a name='L45'><i><font color='green'>// 返回0,若出错则返回出错码。</font></i>
<a name='L46'><b>int</b>
<a name='L47'><a href='../R/683.html' title='Multiple refered from 2 places.'>sys_stat</a> (<b>char</b> *filename, <b>struct</b> stat *statbuf)
<a name='L48'><font color='red'>{</font>
<a name='L49'> <b>struct</b> m_inode *inode;
<a name='L50'>
<a name='L51'><i><font color='green'>// 首先根据文件名找出对应的i 节点,若出错则返回错误码。</font></i>
<a name='L52'> <b>if</b> (!(inode = <a href='../S/14.html#L470' title='Defined at 470 in fs/namei.c.'>namei</a> (filename)))
<a name='L53'> <b>return</b> -<a href='../S/28.html#L31' title='Defined at 31 in include/errno.h.'>ENOENT</a>;
<a name='L54'><i><font color='green'>// 将i 节点上的文件状态信息复制到用户缓冲区中,并释放该i 节点。</font></i>
<a name='L55'> <a href='../S/18.html#L19' title='Defined at 19 in fs/stat.c.'>cp_stat</a> (inode, statbuf);
<a name='L56'> <a href='../S/12.html#L221' title='Defined at 221 in fs/inode.c.'>iput</a> (inode);
<a name='L57'> <b>return</b> 0;
<a name='L58'><font color='red'>}</font>
<a name='L59'>
<a name='L60'><i><font color='green'>//// 文件状态系统调用 - 根据文件句柄获取文件状态信息。</font></i>
<a name='L61'><i><font color='green'>// 参数fd 是指定文件的句柄(描述符),statbuf 是存放状态信息的缓冲区指针。</font></i>
<a name='L62'><i><font color='green'>// 返回0,若出错则返回出错码。</font></i>
<a name='L63'><b>int</b>
<a name='L64'><a href='../R/643.html' title='Multiple refered from 2 places.'>sys_fstat</a> (<b>unsigned</b> <b>int</b> fd, <b>struct</b> stat *statbuf)
<a name='L65'><font color='red'>{</font>
<a name='L66'> <b>struct</b> file *f;
<a name='L67'> <b>struct</b> m_inode *inode;
<a name='L68'>
<a name='L69'><i><font color='green'>// 如果文件句柄值大于一个程序最多打开文件数NR_OPEN,或者该句柄的文件结构指针为空,或者</font></i>
<a name='L70'><i><font color='green'>// 对应文件结构的i 节点字段为空,则出错,返回出错码并退出。</font></i>
<a name='L71'> <b>if</b> (fd >= <a href='../S/31.html#L59' title='Defined at 59 in include/linux/fs.h.'>NR_OPEN</a> || !(f = current->filp[fd]) || !(inode = f->f_inode))
<a name='L72'> <b>return</b> -<a href='../S/28.html#L38' title='Defined at 38 in include/errno.h.'>EBADF</a>;
<a name='L73'><i><font color='green'>// 将i 节点上的文件状态信息复制到用户缓冲区中。</font></i>
<a name='L74'> <a href='../S/18.html#L19' title='Defined at 19 in fs/stat.c.'>cp_stat</a> (inode, statbuf);
<a name='L75'> <b>return</b> 0;
<a name='L76'><font color='red'>}</font>
</pre>
<hr>
<a name='BOTTOM'>
<i><font color='green'>/* [<][>]<a href='#L19'>[^]</a><a href='#L64'>[v]</a><a href='#TOP'>[top]</a>[bottom]<a href='../mains.html'>[index]</a><a href='../help.html'>[help]</a> */</font></i>
</body>
</html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?