9.html

来自「linux 0.11中文版 有注释」· HTML 代码 · 共 129 行

HTML
129
字号
<html>
<head>
<title>fs/fcntl.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>/fcntl.c</h2>
<i><font color='green'>/* [&lt;][&gt;]<a href='#L23'>[^]</a><a href='#L68'>[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='#L23' title='Defined at 23.'>dupfd</a>
<li><a href='#L51' title='Defined at 51.'>sys_dup2</a>
<li><a href='#L60' title='Defined at 60.'>sys_dup</a>
<li><a href='#L68' title='Defined at 68.'>sys_fcntl</a>
</ol>
<hr>
<pre>
<a name='L1'><i><font color='green'>/*</font></i>
<a name='L2'><i><font color='green'>* linux/fs/fcntl.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> &lt;<a href='42.html'>string.h</a>&gt;             <i><font color='green'>// 字符串头文件。主要定义了一些有关字符串操作的嵌入函数。</font></i>
<a name='L8'><font color='darkred'>#include</font> &lt;<a href='28.html'>errno.h</a>&gt;              <i><font color='green'>// 错误号头文件。包含系统中各种出错号。(Linus 从minix 中引进的)。</font></i>
<a name='L9'><font color='darkred'>#include</font> &lt;<a href='36.html'>linux/sched.h</a>&gt;        <i><font color='green'>// 调度程序头文件,定义了任务结构task_struct、初始任务0 的数据,</font></i>
<a name='L10'><i><font color='green'>// 还有一些有关描述符参数设置和获取的嵌入式汇编函数宏语句。</font></i>
<a name='L11'><font color='darkred'>#include</font> &lt;<a href='34.html'>linux/kernel.h</a>&gt;       <i><font color='green'>// 内核头文件。含有一些内核常用函数的原形定义。</font></i>
<a name='L12'><font color='darkred'>#include</font> &lt;<a href='24.html'>asm/segment.h</a>&gt;        <i><font color='green'>// 段操作头文件。定义了有关段寄存器操作的嵌入式汇编函数。</font></i>
<a name='L13'>
<a name='L14'><font color='darkred'>#include</font> &lt;<a href='29.html'>fcntl.h</a>&gt;              <i><font color='green'>// 文件控制头文件。用于文件及其描述符的操作控制常数符号的定义。</font></i>
<a name='L15'><font color='darkred'>#include</font> &lt;<a href='43.html'>sys/stat.h</a>&gt;           <i><font color='green'>// 文件状态头文件。含有文件或文件系统状态结构stat{}和常量。</font></i>
<a name='L16'>
<a name='L17'><b>extern</b> <b>int</b> <a href='../S/15.html#L299' title='Defined at 299 in fs/open.c.'>sys_close</a> (<b>int</b> fd);  <i><font color='green'>// 关闭文件系统调用。(fs/open.c, 192)</font></i>
<a name='L18'>
<a name='L19'><i><font color='green'>//// 复制文件句柄(描述符)。</font></i>
<a name='L20'><i><font color='green'>// 参数fd 是欲复制的文件句柄,arg 指定新文件句柄的最小数值。</font></i>
<a name='L21'><i><font color='green'>// 返回新文件句柄或出错码。</font></i>
<a name='L22'><b>static</b> <b>int</b>
<a name='L23'><a href='../R/447.html' title='Multiple refered from 3 places.'>dupfd</a> (<b>unsigned</b> <b>int</b> fd, <b>unsigned</b> <b>int</b> arg)
<a name='L24'><font color='red'>{</font>
<a name='L25'><i><font color='green'>// 如果文件句柄值大于一个程序最多打开文件数NR_OPEN,或者该句柄的文件结构不存在,则出错,</font></i>
<a name='L26'><i><font color='green'>// 返回出错码并退出。</font></i>
<a name='L27'>  <b>if</b> (fd &gt;= <a href='../S/31.html#L59' title='Defined at 59 in include/linux/fs.h.'>NR_OPEN</a> || !current-&gt;filp[fd])
<a name='L28'>    <b>return</b> -<a href='../S/28.html#L38' title='Defined at 38 in include/errno.h.'>EBADF</a>;
<a name='L29'><i><font color='green'>// 如果指定的新句柄值arg 大于最多打开文件数,则出错,返回出错码并退出。</font></i>
<a name='L30'>  <b>if</b> (arg &gt;= <a href='../S/31.html#L59' title='Defined at 59 in include/linux/fs.h.'>NR_OPEN</a>)
<a name='L31'>    <b>return</b> -<a href='../S/28.html#L51' title='Defined at 51 in include/errno.h.'>EINVAL</a>;
<a name='L32'><i><font color='green'>// 在当前进程的文件结构指针数组中寻找索引号大于等于arg 但还没有使用的项。</font></i>
<a name='L33'>  <b>while</b> (arg &lt; <a href='../S/31.html#L59' title='Defined at 59 in include/linux/fs.h.'>NR_OPEN</a>)
<a name='L34'>    <b>if</b> (current-&gt;filp[arg])
<a name='L35'>      arg++;
<a name='L36'>    <b>else</b>
<a name='L37'>      <b>break</b>;
<a name='L38'><i><font color='green'>// 如果找到的新句柄值arg 大于最多打开文件数,则出错,返回出错码并退出。</font></i>
<a name='L39'>  <b>if</b> (arg &gt;= <a href='../S/31.html#L59' title='Defined at 59 in include/linux/fs.h.'>NR_OPEN</a>)
<a name='L40'>    <b>return</b> -<a href='../S/28.html#L53' title='Defined at 53 in include/errno.h.'>EMFILE</a>;
<a name='L41'><i><font color='green'>// 在执行时关闭标志位图中复位该句柄位。也即在运行exec()类函数时不关闭该句柄。</font></i>
<a name='L42'>  current-&gt;close_on_exec &amp;= ~(1 &lt;&lt; arg);
<a name='L43'><i><font color='green'>// 令该文件结构指针等于原句柄fd 的指针,并将文件引用计数增1。</font></i>
<a name='L44'>  (current-&gt;filp[arg] = current-&gt;filp[fd])-&gt;f_count++;
<a name='L45'>  <b>return</b> arg;                   <i><font color='green'>// 返回新的文件句柄。</font></i>
<a name='L46'><font color='red'>}</font>
<a name='L47'>
<a name='L48'><i><font color='green'>//// 复制文件句柄系统调用函数。</font></i>
<a name='L49'><i><font color='green'>// 复制指定文件句柄oldfd,新句柄值等于newfd。如果newfd 已经打开,则首先关闭之。</font></i>
<a name='L50'><b>int</b>
<a name='L51'><a href='../R/640.html' title='Multiple refered from 2 places.'>sys_dup2</a> (<b>unsigned</b> <b>int</b> oldfd, <b>unsigned</b> <b>int</b> newfd)
<a name='L52'><font color='red'>{</font>
<a name='L53'>  <a href='../S/15.html#L299' title='Defined at 299 in fs/open.c.'>sys_close</a> (newfd);            <i><font color='green'>// 若句柄newfd 已经打开,则首先关闭之。</font></i>
<a name='L54'>  <b>return</b> <a href='../S/9.html#L23' title='Defined at 23 in fs/fcntl.c.'>dupfd</a> (oldfd, newfd);  <i><font color='green'>// 复制并返回新句柄。</font></i>
<a name='L55'><font color='red'>}</font>
<a name='L56'>
<a name='L57'><i><font color='green'>//// 复制文件句柄系统调用函数。</font></i>
<a name='L58'><i><font color='green'>// 复制指定文件句柄oldfd,新句柄的值是当前最小的未用句柄。</font></i>
<a name='L59'><b>int</b>
<a name='L60'><a href='../R/639.html' title='Multiple refered from 2 places.'>sys_dup</a> (<b>unsigned</b> <b>int</b> fildes)
<a name='L61'><font color='red'>{</font>
<a name='L62'>  <b>return</b> <a href='../S/9.html#L23' title='Defined at 23 in fs/fcntl.c.'>dupfd</a> (fildes, 0);
<a name='L63'><font color='red'>}</font>
<a name='L64'>
<a name='L65'><i><font color='green'>//// 文件控制系统调用函数。</font></i>
<a name='L66'><i><font color='green'>// 参数fd 是文件句柄,cmd 是操作命令(参见include/fcntl.h,23-30 行)。</font></i>
<a name='L67'><b>int</b>
<a name='L68'><a href='../R/642.html' title='Multiple refered from 2 places.'>sys_fcntl</a> (<b>unsigned</b> <b>int</b> fd, <b>unsigned</b> <b>int</b> cmd, <b>unsigned</b> <b>long</b> arg)
<a name='L69'><font color='red'>{</font>
<a name='L70'>  <b>struct</b> file *filp;
<a name='L71'>
<a name='L72'><i><font color='green'>// 如果文件句柄值大于一个进程最多打开文件数NR_OPEN,或者该句柄的文件结构指针为空,则出错,</font></i>
<a name='L73'><i><font color='green'>// 返回出错码并退出。</font></i>
<a name='L74'>  <b>if</b> (fd &gt;= <a href='../S/31.html#L59' title='Defined at 59 in include/linux/fs.h.'>NR_OPEN</a> || !(filp = current-&gt;filp[fd]))
<a name='L75'>    <b>return</b> -<a href='../S/28.html#L38' title='Defined at 38 in include/errno.h.'>EBADF</a>;
<a name='L76'><i><font color='green'>// 根据不同命令cmd 进行分别处理。</font></i>
<a name='L77'>  <b>switch</b> (cmd)
<a name='L78'>    <font color='red'>{</font>
<a name='L79'>    <b>case</b> <a href='../S/29.html#L30' title='Defined at 30 in include/fcntl.h.'>F_DUPFD</a>:               <i><font color='green'>// 复制文件句柄。</font></i>
<a name='L80'>      <b>return</b> <a href='../S/9.html#L23' title='Defined at 23 in fs/fcntl.c.'>dupfd</a> (fd, arg);
<a name='L81'>    <b>case</b> <a href='../S/29.html#L31' title='Defined at 31 in include/fcntl.h.'>F_GETFD</a>:               <i><font color='green'>// 取文件句柄的执行时关闭标志。</font></i>
<a name='L82'>      <b>return</b> (current-&gt;close_on_exec &gt;&gt; fd) &amp; 1;
<a name='L83'>    <b>case</b> <a href='../S/29.html#L32' title='Defined at 32 in include/fcntl.h.'>F_SETFD</a>:               <i><font color='green'>// 设置句柄执行时关闭标志。arg 位0 置位是设置,否则关闭。</font></i>
<a name='L84'>      <b>if</b> (arg &amp; 1)
<a name='L85'>        current-&gt;close_on_exec |= (1 &lt;&lt; fd);
<a name='L86'>      <b>else</b>
<a name='L87'>        current-&gt;close_on_exec &amp;= ~(1 &lt;&lt; fd);
<a name='L88'>      <b>return</b> 0;
<a name='L89'>    <b>case</b> <a href='../S/29.html#L33' title='Defined at 33 in include/fcntl.h.'>F_GETFL</a>:               <i><font color='green'>// 取文件状态标志和访问模式。</font></i>
<a name='L90'>      <b>return</b> filp-&gt;f_flags;
<a name='L91'>    <b>case</b> <a href='../S/29.html#L34' title='Defined at 34 in include/fcntl.h.'>F_SETFL</a>:               <i><font color='green'>// 设置文件状态和访问模式(根据arg 设置添加、非阻塞标志)。</font></i>
<a name='L92'>      filp-&gt;f_flags &amp;= ~(<a href='../S/29.html#L18' title='Defined at 18 in include/fcntl.h.'>O_APPEND</a> | <a href='../S/29.html#L19' title='Defined at 19 in include/fcntl.h.'>O_NONBLOCK</a>);
<a name='L93'>      filp-&gt;f_flags |= arg &amp; (<a href='../S/29.html#L18' title='Defined at 18 in include/fcntl.h.'>O_APPEND</a> | <a href='../S/29.html#L19' title='Defined at 19 in include/fcntl.h.'>O_NONBLOCK</a>);
<a name='L94'>      <b>return</b> 0;
<a name='L95'>    <b>case</b> <a href='../S/29.html#L36' title='Defined at 36 in include/fcntl.h.'>F_GETLK</a>:
<a name='L96'>    <b>case</b> <a href='../S/29.html#L37' title='Defined at 37 in include/fcntl.h.'>F_SETLK</a>:
<a name='L97'>    <b>case</b> <a href='../S/29.html#L38' title='Defined at 38 in include/fcntl.h.'>F_SETLKW</a>:              <i><font color='green'>// 未实现。</font></i>
<a name='L98'>      <b>return</b> -1;
<a name='L99'>    <b>default</b>:
<a name='L100'>      <b>return</b> -1;
<a name='L101'>    <font color='red'>}</font>
<a name='L102'><font color='red'>}</font>
</pre>
<hr>
<a name='BOTTOM'>
<i><font color='green'>/* [&lt;][&gt;]<a href='#L23'>[^]</a><a href='#L68'>[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 + -
显示快捷键?