⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 10.html

📁 linux 0.11中文版 有注释
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<a name='L67'>  inode-&gt;i_atime = <a href='../S/36.html#L234' title='Defined at 234 in include/linux/sched.h.'>CURRENT_TIME</a>;
<a name='L68'>  <b>return</b> (<a href='../D/738.html' title='Multiple defined in 17 places.'>count</a> - left) ? (<a href='../D/738.html' title='Multiple defined in 17 places.'>count</a> - left) : -<a href='../S/28.html#L29' title='Defined at 29 in include/errno.h.'>ERROR</a>;
<a name='L69'><font color='red'>}</font>
<a name='L70'>
<a name='L71'><i><font color='green'>//// 文件写函数 - 根据i 节点和文件结构信息,将用户数据写入指定设备。</font></i>
<a name='L72'><i><font color='green'>// 由i 节点可以知道设备号,由filp 结构可以知道文件中当前读写指针位置。buf 指定用户态中</font></i>
<a name='L73'><i><font color='green'>// 缓冲区的位置,count 为需要写入的字节数。返回值是实际写入的字节数,或出错号(小于0)。</font></i>
<a name='L74'><b>int</b>
<a name='L75'><a href='../R/451.html' title='Multiple refered from 2 places.'>file_write</a> (<b>struct</b> m_inode *inode, <b>struct</b> file *filp, <b>char</b> *buf, <b>int</b> count)
<a name='L76'><font color='red'>{</font>
<a name='L77'>  <a href='../S/45.html#L32' title='Defined at 32 in include/sys/types.h.'>off_t</a> <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a>;
<a name='L78'>  <b>int</b> block, c;
<a name='L79'>  <b>struct</b> buffer_head *bh;
<a name='L80'>  <b>char</b> *p;
<a name='L81'>  <b>int</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = 0;
<a name='L82'>
<a name='L83'><i><font color='green'>/*</font></i>
<a name='L84'><i><font color='green'>* ok, append may not work when many processes are writing at the same time</font></i>
<a name='L85'><i><font color='green'>* but so what. That way leads to madness anyway.</font></i>
<a name='L86'><i><font color='green'>*/</font></i>
<a name='L87'><i><font color='green'>/*</font></i>
<a name='L88'><i><font color='green'>* ok,当许多进程同时写时,append 操作可能不行,但那又怎样。不管怎样那样做会</font></i>
<a name='L89'><i><font color='green'>* 导致混乱一团。</font></i>
<a name='L90'><i><font color='green'>*/</font></i>
<a name='L91'><i><font color='green'>// 如果是要向文件后添加数据,则将文件读写指针移到文件尾部。否则就将在文件读写指针处写入。</font></i>
<a name='L92'>  <b>if</b> (filp-&gt;f_flags &amp; <a href='../S/29.html#L18' title='Defined at 18 in include/fcntl.h.'>O_APPEND</a>)
<a name='L93'>    <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a> = inode-&gt;i_size;
<a name='L94'>  <b>else</b>
<a name='L95'>    <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a> = filp-&gt;f_pos;
<a name='L96'><i><font color='green'>// 若已写入字节数i 小于需要写入的字节数count,则循环执行以下操作。</font></i>
<a name='L97'>  <b>while</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> &lt; <a href='../D/738.html' title='Multiple defined in 17 places.'>count</a>)
<a name='L98'>    <font color='red'>{</font>
<a name='L99'><i><font color='green'>// 创建数据块号(pos/BLOCK_SIZE)在设备上对应的逻辑块,并返回在设备上的逻辑块号。如果逻辑</font></i>
<a name='L100'><i><font color='green'>// 块号=0,则表示创建失败,退出循环。</font></i>
<a name='L101'>      <b>if</b> (!(block = <a href='../S/12.html#L214' title='Defined at 214 in fs/inode.c.'>create_block</a> (inode, <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a> / <a href='../D/23.html' title='Multiple defined in 2 places.'>BLOCK_SIZE</a>)))
<a name='L102'>        <b>break</b>;
<a name='L103'><i><font color='green'>// 根据该逻辑块号读取设备上的相应数据块,若出错则退出循环。</font></i>
<a name='L104'>      <b>if</b> (!(bh = <a href='../S/6.html#L397' title='Defined at 397 in fs/buffer.c.'>bread</a> (inode-&gt;i_dev, block)))
<a name='L105'>        <b>break</b>;
<a name='L106'><i><font color='green'>// 求出文件读写指针在数据块中的偏移值c,将p 指向读出数据块缓冲区中开始读取的位置。置该</font></i>
<a name='L107'><i><font color='green'>// 缓冲区已修改标志。</font></i>
<a name='L108'>      c = <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a> % <a href='../D/23.html' title='Multiple defined in 2 places.'>BLOCK_SIZE</a>;
<a name='L109'>      p = c + bh-&gt;b_data;
<a name='L110'>      bh-&gt;b_dirt = 1;
<a name='L111'><i><font color='green'>// 从开始读写位置到块末共可写入c=(BLOCK_SIZE-c)个字节。若c 大于剩余还需写入的字节数</font></i>
<a name='L112'><i><font color='green'>// (count-i),则此次只需再写入c=(count-i)即可。</font></i>
<a name='L113'>      c = <a href='../D/23.html' title='Multiple defined in 2 places.'>BLOCK_SIZE</a> - c;
<a name='L114'>      <b>if</b> (c &gt; <a href='../D/738.html' title='Multiple defined in 17 places.'>count</a> - <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>)
<a name='L115'>        c = <a href='../D/738.html' title='Multiple defined in 17 places.'>count</a> - <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L116'><i><font color='green'>// 文件读写指针前移此次需写入的字节数。如果当前文件读写指针位置值超过了文件的大小,则</font></i>
<a name='L117'><i><font color='green'>// 修改i 节点中文件大小字段,并置i 节点已修改标志。</font></i>
<a name='L118'>      <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a> += c;
<a name='L119'>      <b>if</b> (<a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a> &gt; inode-&gt;i_size)
<a name='L120'>        <font color='red'>{</font>
<a name='L121'>          inode-&gt;i_size = <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a>;
<a name='L122'>          inode-&gt;i_dirt = 1;
<a name='L123'>        <font color='red'>}</font>
<a name='L124'><i><font color='green'>// 已写入字节计数累加此次写入的字节数c。从用户缓冲区buf 中复制c 个字节到高速缓冲区中p</font></i>
<a name='L125'><i><font color='green'>// 指向开始的位置处。然后释放该缓冲区。</font></i>
<a name='L126'>      <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> += c;
<a name='L127'>      <b>while</b> (c-- &gt; 0)
<a name='L128'>        *(p++) = <a href='../D/821.html' title='Multiple defined in 2 places.'>get_fs_byte</a> (<a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>++);
<a name='L129'>      <a href='../S/6.html#L377' title='Defined at 377 in fs/buffer.c.'>brelse</a> (bh);
<a name='L130'>    <font color='red'>}</font>
<a name='L131'><i><font color='green'>// 更改文件修改时间为当前时间。</font></i>
<a name='L132'>  inode-&gt;i_mtime = <a href='../S/36.html#L234' title='Defined at 234 in include/linux/sched.h.'>CURRENT_TIME</a>;
<a name='L133'><i><font color='green'>// 如果此次操作不是在文件尾添加数据,则把文件读写指针调整到当前读写位置,并更改i 节点修改</font></i>
<a name='L134'><i><font color='green'>// 时间为当前时间。</font></i>
<a name='L135'>  <b>if</b> (!(filp-&gt;f_flags &amp; <a href='../S/29.html#L18' title='Defined at 18 in include/fcntl.h.'>O_APPEND</a>))
<a name='L136'>    <font color='red'>{</font>
<a name='L137'>      filp-&gt;f_pos = <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a>;
<a name='L138'>      inode-&gt;i_ctime = <a href='../S/36.html#L234' title='Defined at 234 in include/linux/sched.h.'>CURRENT_TIME</a>;
<a name='L139'>    <font color='red'>}</font>
<a name='L140'><i><font color='green'>// 返回写入的字节数,若写入字节数为0,则返回出错号-1。</font></i>
<a name='L141'>  <b>return</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> ? <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> : -1);
<a name='L142'><font color='red'>}</font>
</pre>
<hr>
<a name='BOTTOM'>
<i><font color='green'>/* [&lt;][&gt;]<a href='#L22'>[^]</a><a href='#L75'>[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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -