15.html

来自「linux 0.11中文版 有注释」· HTML 代码 · 共 355 行 · 第 1/3 页

HTML
355
字号
<a name='L213'><b>int</b>
<a name='L214'><a href='../R/663.html' title='Multiple refered from 3 places.'>sys_open</a> (<b>const</b> <b>char</b> *filename, <b>int</b> flag, <b>int</b> mode)
<a name='L215'><font color='red'>{</font>
<a name='L216'>  <b>struct</b> m_inode *inode;
<a name='L217'>  <b>struct</b> file *f;
<a name='L218'>  <b>int</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>, fd;
<a name='L219'>
<a name='L220'><i><font color='green'>// 将用户设置的模式与进程的模式屏蔽码相与,产生许可的文件模式。</font></i>
<a name='L221'>  mode &amp;= 0777 &amp; ~current-&gt;umask;
<a name='L222'><i><font color='green'>// 搜索进程结构中文件结构指针数组,查找一个空闲项,若已经没有空闲项,则返回出错码。</font></i>
<a name='L223'>  <b>for</b> (fd = 0; fd &lt; <a href='../S/31.html#L59' title='Defined at 59 in include/linux/fs.h.'>NR_OPEN</a>; fd++)
<a name='L224'>    <b>if</b> (!current-&gt;filp[fd])
<a name='L225'>      <b>break</b>;
<a name='L226'>  <b>if</b> (fd &gt;= <a href='../S/31.html#L59' title='Defined at 59 in include/linux/fs.h.'>NR_OPEN</a>)
<a name='L227'>    <b>return</b> -<a href='../S/28.html#L51' title='Defined at 51 in include/errno.h.'>EINVAL</a>;
<a name='L228'><i><font color='green'>// 设置执行时关闭文件句柄位图,复位对应比特位。</font></i>
<a name='L229'>  current-&gt;close_on_exec &amp;= ~(1 &lt;&lt; fd);
<a name='L230'><i><font color='green'>// 令f 指向文件表数组开始处。搜索空闲文件结构项(句柄引用计数为0 的项),若已经没有空闲</font></i>
<a name='L231'><i><font color='green'>// 文件表结构项,则返回出错码。</font></i>
<a name='L232'>  f = 0 + file_table;
<a name='L233'>  <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> &lt; <a href='../S/31.html#L61' title='Defined at 61 in include/linux/fs.h.'>NR_FILE</a>; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>++, f++)
<a name='L234'>    <b>if</b> (!f-&gt;f_count)
<a name='L235'>      <b>break</b>;
<a name='L236'>  <b>if</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> &gt;= <a href='../S/31.html#L61' title='Defined at 61 in include/linux/fs.h.'>NR_FILE</a>)
<a name='L237'>    <b>return</b> -<a href='../S/28.html#L51' title='Defined at 51 in include/errno.h.'>EINVAL</a>;
<a name='L238'><i><font color='green'>// 让进程的对应文件句柄的文件结构指针指向搜索到的文件结构,并令句柄引用计数递增1。</font></i>
<a name='L239'>  (current-&gt;filp[fd] = f)-&gt;f_count++;
<a name='L240'><i><font color='green'>// 调用函数执行打开操作,若返回值小于0,则说明出错,释放刚申请到的文件结构,返回出错码。</font></i>
<a name='L241'>  <b>if</b> ((<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = <a href='../S/14.html#L522' title='Defined at 522 in fs/namei.c.'>open_namei</a> (filename, flag, mode, &amp;inode)) &lt; 0)
<a name='L242'>    <font color='red'>{</font>
<a name='L243'>      current-&gt;filp[fd] = <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L244'>      f-&gt;f_count = 0;
<a name='L245'>      <b>return</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L246'>    <font color='red'>}</font>
<a name='L247'><i><font color='green'>/* ttys are somewhat special (ttyxx major==4, tty major==5) */</font></i>
<a name='L248'><i><font color='green'>/* ttys 有些特殊(ttyxx 主号==4,tty 主号==5)*/</font></i>
<a name='L249'><i><font color='green'>// 如果是字符设备文件,那么如果设备号是4 的话,则设置当前进程的tty 号为该i 节点的子设备号。</font></i>
<a name='L250'><i><font color='green'>// 并设置当前进程tty 对应的tty 表项的父进程组号等于进程的父进程组号。</font></i>
<a name='L251'>  <b>if</b> (<a href='../S/43.html#L36' title='Defined at 36 in include/sys/stat.h.'>S_ISCHR</a> (inode-&gt;i_mode))
<a name='L252'>    <b>if</b> (<a href='../S/31.html#L49' title='Defined at 49 in include/linux/fs.h.'>MAJOR</a> (inode-&gt;i_zone[0]) == 4)
<a name='L253'>      <font color='red'>{</font>
<a name='L254'>        <b>if</b> (current-&gt;leader &amp;&amp; current-&gt;<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a> &lt; 0)
<a name='L255'>          <font color='red'>{</font>
<a name='L256'>            current-&gt;<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a> = <a href='../D/238.html' title='Multiple defined in 2 places.'>MINOR</a> (inode-&gt;i_zone[0]);
<a name='L257'>            tty_table[current-&gt;<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>].pgrp = current-&gt;pgrp;
<a name='L258'>          <font color='red'>}</font>
<a name='L259'><i><font color='green'>// 否则如果该字符文件设备号是5 的话,若当前进程没有tty,则说明出错,释放i 节点和申请到的</font></i>
<a name='L260'><i><font color='green'>// 文件结构,返回出错码。</font></i>
<a name='L261'>      <font color='red'>}</font>
<a name='L262'>    <b>else</b> <b>if</b> (<a href='../S/31.html#L49' title='Defined at 49 in include/linux/fs.h.'>MAJOR</a> (inode-&gt;i_zone[0]) == 5)
<a name='L263'>      <b>if</b> (current-&gt;<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a> &lt; 0)
<a name='L264'>        <font color='red'>{</font>
<a name='L265'>          <a href='../S/12.html#L221' title='Defined at 221 in fs/inode.c.'>iput</a> (inode);
<a name='L266'>          current-&gt;filp[fd] = <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L267'>          f-&gt;f_count = 0;
<a name='L268'>          <b>return</b> -<a href='../D/112.html' title='Multiple defined in 2 places.'>EPERM</a>;
<a name='L269'>        <font color='red'>}</font>
<a name='L270'><i><font color='green'>/* Likewise with block-devices: check for floppy_change */</font></i>
<a name='L271'><i><font color='green'>/* 同样对于块设备文件:需要检查盘片是否被更换 */</font></i>
<a name='L272'><i><font color='green'>// 如果打开的是块设备文件,则检查盘片是否更换,若更换则需要是高速缓冲中对应该设备的所有</font></i>
<a name='L273'><i><font color='green'>// 缓冲块失效。</font></i>
<a name='L274'>  <b>if</b> (<a href='../S/43.html#L37' title='Defined at 37 in include/sys/stat.h.'>S_ISBLK</a> (inode-&gt;i_mode))
<a name='L275'>    <a href='../S/6.html#L165' title='Defined at 165 in fs/buffer.c.'>check_disk_change</a> (inode-&gt;i_zone[0]);
<a name='L276'><i><font color='green'>// 初始化文件结构。置文件结构属性和标志,置句柄引用计数为1,设置i 节点字段,文件读写指针</font></i>
<a name='L277'><i><font color='green'>// 初始化为0。返回文件句柄。</font></i>
<a name='L278'>  f-&gt;f_mode = inode-&gt;i_mode;
<a name='L279'>  f-&gt;f_flags = flag;
<a name='L280'>  f-&gt;f_count = 1;
<a name='L281'>  f-&gt;f_inode = inode;
<a name='L282'>  f-&gt;f_pos = 0;
<a name='L283'>  <b>return</b> (fd);
<a name='L284'><font color='red'>}</font>
<a name='L285'>
<a name='L286'><i><font color='green'>//// 创建文件系统调用函数。</font></i>
<a name='L287'><i><font color='green'>// 参数pathname 是路径名,mode 与上面的sys_open()函数相同。</font></i>
<a name='L288'><i><font color='green'>// 成功则返回文件句柄,否则返回出错码。</font></i>
<a name='L289'><b>int</b>
<a name='L290'><a href='../R/638.html' title='Multiple refered from 2 places.'>sys_creat</a> (<b>const</b> <b>char</b> *pathname, <b>int</b> mode)
<a name='L291'><font color='red'>{</font>
<a name='L292'>  <b>return</b> <a href='../S/15.html#L214' title='Defined at 214 in fs/open.c.'>sys_open</a> (pathname, <a href='../S/29.html#L14' title='Defined at 14 in include/fcntl.h.'>O_CREAT</a> | <a href='../S/29.html#L17' title='Defined at 17 in include/fcntl.h.'>O_TRUNC</a>, mode);
<a name='L293'><font color='red'>}</font>
<a name='L294'>
<a name='L295'><i><font color='green'>// 关闭文件系统调用函数。</font></i>
<a name='L296'><i><font color='green'>// 参数fd 是文件句柄。</font></i>
<a name='L297'><i><font color='green'>// 成功则返回0,否则返回出错码。</font></i>
<a name='L298'><b>int</b>
<a name='L299'><a href='../R/637.html' title='Multiple refered from 8 places.'>sys_close</a> (<b>unsigned</b> <b>int</b> fd)
<a name='L300'><font color='red'>{</font>
<a name='L301'>  <b>struct</b> file *filp;
<a name='L302'>
<a name='L303'><i><font color='green'>// 若文件句柄值大于程序同时能打开的文件数,则返回出错码。</font></i>
<a name='L304'>  <b>if</b> (fd &gt;= <a href='../S/31.html#L59' title='Defined at 59 in include/linux/fs.h.'>NR_OPEN</a>)
<a name='L305'>    <b>return</b> -<a href='../S/28.html#L51' title='Defined at 51 in include/errno.h.'>EINVAL</a>;
<a name='L306'><i><font color='green'>// 复位进程的执行时关闭文件句柄位图对应位。</font></i>
<a name='L307'>  current-&gt;close_on_exec &amp;= ~(1 &lt;&lt; fd);
<a name='L308'><i><font color='green'>// 若该文件句柄对应的文件结构指针是NULL,则返回出错码。</font></i>
<a name='L309'>  <b>if</b> (!(filp = current-&gt;filp[fd]))
<a name='L310'>    <b>return</b> -<a href='../S/28.html#L51' title='Defined at 51 in include/errno.h.'>EINVAL</a>;
<a name='L311'><i><font color='green'>// 置该文件句柄的文件结构指针为NULL。</font></i>
<a name='L312'>  current-&gt;filp[fd] = <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L313'><i><font color='green'>// 若在关闭文件之前,对应文件结构中的句柄引用计数已经为0,则说明内核出错,死机。</font></i>
<a name='L314'>  <b>if</b> (filp-&gt;f_count == 0)
<a name='L315'>    <a href='../S/72.html#L24' title='Defined at 24 in kernel/panic.c.'>panic</a> ("Close: file count is 0");
<a name='L316'><i><font color='green'>// 否则将对应文件结构的句柄引用计数减1,如果还不为0,则返回0(成功)。若已等于0,说明该</font></i>
<a name='L317'><i><font color='green'>// 文件已经没有句柄引用,则释放该文件i 节点,返回0。</font></i>
<a name='L318'>  <b>if</b> (--filp-&gt;f_count)
<a name='L319'>    <b>return</b> (0);
<a name='L320'>  <a href='../S/12.html#L221' title='Defined at 221 in fs/inode.c.'>iput</a> (filp-&gt;f_inode);
<a name='L321'>  <b>return</b> (0);
<a name='L322'><font color='red'>}</font>
</pre>
<hr>
<a name='BOTTOM'>
<i><font color='green'>/* [&lt;][&gt;]<a href='#L22'>[^]</a><a href='#L299'>[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 + -
显示快捷键?