Skip to content

Commit

Permalink
Site updated: 2024-09-25 15:00:26
Browse files Browse the repository at this point in the history
  • Loading branch information
Libra committed Sep 25, 2024
1 parent baf2706 commit 4c2d50f
Showing 1 changed file with 285 additions and 1 deletion.
286 changes: 285 additions & 1 deletion 2024/09/21/System-programming/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,291 @@
</li>
</ul>
</li>
<li>文件描述符</li>
<li>文件描述符<ul>
<li>内核管理文件的数据结构<ul>
<li>fd</li>
<li>文件描述符表</li>
<li>打开文件<ul>
<li>flags</li>
<li>文件的位置</li>
<li>vnode的指针</li>
<li>引用计数</li>
</ul>
</li>
<li>vnode<ul>
<li>inode的副本</li>
<li>设备号</li>
</ul>
</li>
<li>inode</li>
</ul>
</li>
<li>为什么这么设计<ul>
<li>安全</li>
<li>简单方便</li>
<li>提供了统一的操作方式<ul>
<li>通用性</li>
</ul>
</li>
</ul>
</li>
<li>操作<ul>
<li>open<ul>
<li>作用:打开文件描述符</li>
<li>参数<ul>
<li>path</li>
<li>flags<ul>
<li>O_RDONLY</li>
<li>O_WRONLY</li>
<li>O_RDWR</li>
<li>O_CREAT</li>
<li>O_EXCL</li>
<li>O_TRUNC</li>
<li>O_APPEND</li>
</ul>
</li>
<li>mode<ul>
<li>如果flags里设置了 O_CREAT, 就需要传入文件的创建权限</li>
</ul>
</li>
</ul>
</li>
<li>返回值<ul>
<li>成功:文件描述符 (最小可用的文件描述符)</li>
<li>失败:-1, 并设置errno</li>
</ul>
</li>
</ul>
</li>
<li>close<ul>
<li>作用:关闭文件描述符</li>
<li>参数<ul>
<li>fd</li>
</ul>
</li>
<li>返回值<ul>
<li>成功:0</li>
<li>失败:-1,并设置errno</li>
</ul>
</li>
</ul>
</li>
<li>read<ul>
<li>作用:读文件描述符</li>
<li>参数<ul>
<li>fd</li>
<li>buf</li>
<li>size</li>
</ul>
</li>
<li>返回值<ul>
<li>成功:返回实际读取的字节数目。如果返回值为 0,表示读到了文件的末尾。</li>
<li>失败:-1,并设置errno</li>
</ul>
</li>
</ul>
</li>
<li>write<ul>
<li>作用:写文件描述符</li>
<li>参数<ul>
<li>fd</li>
<li>buf</li>
<li>size</li>
</ul>
</li>
<li>返回值<ul>
<li>成功:返回实际写入的字节数目</li>
<li>失败:-1,并设置errno</li>
</ul>
</li>
</ul>
</li>
<li>lseek<ul>
<li>作用:移动文件位置</li>
<li>参数<ul>
<li>fd</li>
<li>offset</li>
<li>whence<ul>
<li>SEEK_SET</li>
<li>SEEK_CUR</li>
<li>SEEK_END</li>
</ul>
</li>
</ul>
</li>
<li>返回值<ul>
<li>成功:移动后文件的位置</li>
<li>失败:-1,并设置errno</li>
</ul>
</li>
</ul>
</li>
<li>fsync<ul>
<li>作用:将数据写回到磁盘</li>
<li>参数<ul>
<li>fd</li>
</ul>
</li>
<li>返回值<ul>
<li>成功:0</li>
<li>失败:-1,并设置errno</li>
</ul>
</li>
</ul>
</li>
<li>ftruncate<ul>
<li>作用:截断文件</li>
<li>参数<ul>
<li>fd</li>
<li>length<ul>
<li>length &lt; 原文件大小,截断的数据会丢失</li>
<li>length &gt; 原文件大小,扩充的部分会填入空字符 (‘\0’)</li>
</ul>
</li>
</ul>
</li>
<li>返回值<ul>
<li>成功:0</li>
<li>失败:-1,并设置errno</li>
</ul>
</li>
</ul>
</li>
<li>fstat<ul>
<li>作用:查看文件的元数据</li>
<li>参数<ul>
<li>fd</li>
<li>struct stat* statbuf<ul>
<li>传出参数,用来存储文件的元数据<ul>
<li>struct stat<ul>
<li>st_ino</li>
<li>st_size</li>
<li>st_mode</li>
<li>st_blocks</li>
<li>st_nlinks</li>
<li>……</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>返回值<ul>
<li>成功:0</li>
<li>失败:-1,并设置errno</li>
</ul>
</li>
</ul>
</li>
<li>dup<ul>
<li>作用:复制文件描述符</li>
<li>参数<ul>
<li>oldfd</li>
</ul>
</li>
<li>返回值<ul>
<li>成功:新的文件描述符 (最小可用的文件描述符)</li>
<li>失败:-1,并设置 errno</li>
</ul>
</li>
<li>缺陷<ul>
<li>不能指定 newfd</li>
<li>close(); dup() 之间有一个时间窗口,可能会引发竞态条件,导致并发问题。</li>
</ul>
</li>
</ul>
</li>
<li>dup2<ul>
<li>作用:复制文件描述符</li>
<li>参数<ul>
<li>oldfd</li>
<li>newfd</li>
</ul>
</li>
<li>返回值<ul>
<li>成功:新的文件描述符</li>
<li>失败:-1,并设置 errno</li>
</ul>
</li>
</ul>
</li>
<li>内存映射 I&#x2F;O<ul>
<li>mmap<ul>
<li>作用:将文件的内容直接映射到进程的虚拟内存空间</li>
<li>参数<ul>
<li>addr<ul>
<li>一般填 NULL,由内核指定起始位置</li>
</ul>
</li>
<li>length</li>
<li>prot<ul>
<li>PROT_NONE</li>
<li>PROT_READ</li>
<li>PROT_WRITE</li>
<li>PROT_EXEC</li>
</ul>
</li>
<li>flags<ul>
<li>MAP_PRIVATE<ul>
<li>特点<ul>
<li>写时复制</li>
<li>对映射区的修改,不会写回到底层文件</li>
</ul>
</li>
<li>作用:用文件的内容初始化内存空间</li>
</ul>
</li>
<li>MAP_SHARED<ul>
<li>特点<ul>
<li>对映射区的修改,会写回到磁盘</li>
<li>进程共享</li>
</ul>
</li>
<li>作用<ul>
<li>内存映射 I&#x2F;O (零拷贝), 一般适用于大文件</li>
<li>IPC</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>fd</li>
<li>offset<ul>
<li>一定是页的整数倍</li>
</ul>
</li>
</ul>
</li>
<li>返回值<ul>
<li>成功:映射区的起始地址</li>
<li>失败:MAP_FAILED,并设置 errno</li>
</ul>
</li>
</ul>
</li>
<li>munmap<ul>
<li>作用:解除映射</li>
<li>参数<ul>
<li>addr</li>
<li>length</li>
</ul>
</li>
<li>返回值<ul>
<li>成功:0</li>
<li>失败:-1,并设置errno</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
Expand Down

0 comments on commit 4c2d50f

Please sign in to comment.