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 &= 0777 & ~current->umask;
<a name='L222'><i><font color='green'>// 搜索进程结构中文件结构指针数组,查找一个空闲项,若已经没有空闲项,则返回出错码。</font></i>
<a name='L223'> <b>for</b> (fd = 0; fd < <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->filp[fd])
<a name='L225'> <b>break</b>;
<a name='L226'> <b>if</b> (fd >= <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->close_on_exec &= ~(1 << 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> < <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->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> >= <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->filp[fd] = f)->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, &inode)) < 0)
<a name='L242'> <font color='red'>{</font>
<a name='L243'> current->filp[fd] = <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L244'> f->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->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->i_zone[0]) == 4)
<a name='L253'> <font color='red'>{</font>
<a name='L254'> <b>if</b> (current->leader && current-><a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a> < 0)
<a name='L255'> <font color='red'>{</font>
<a name='L256'> current-><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->i_zone[0]);
<a name='L257'> tty_table[current-><a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>].pgrp = current->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->i_zone[0]) == 5)
<a name='L263'> <b>if</b> (current-><a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a> < 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->filp[fd] = <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L267'> f->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->i_mode))
<a name='L275'> <a href='../S/6.html#L165' title='Defined at 165 in fs/buffer.c.'>check_disk_change</a> (inode->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->f_mode = inode->i_mode;
<a name='L279'> f->f_flags = flag;
<a name='L280'> f->f_count = 1;
<a name='L281'> f->f_inode = inode;
<a name='L282'> f->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 >= <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->close_on_exec &= ~(1 << fd);
<a name='L308'><i><font color='green'>// 若该文件句柄对应的文件结构指针是NULL,则返回出错码。</font></i>
<a name='L309'> <b>if</b> (!(filp = current->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->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->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->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->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'>/* [<][>]<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 + -
显示快捷键?