深入理解计算机系统—阅读摘要
系统级IO
每个进程都有个umask,通过umask函数来设置的,当进程通过带某个mode参数的open函数来创建一个新文件时,文件的访问权限位被设置为mode & ~umask,也就是umask是程序设定的掩码,哪怕你open时mode为777,最后出来的权限有可能不是777了。
共享文件:
- 每个进程都有它独立的描述符表,它的表项是由进程打开的文件描述符来索引的。每个打开的描述符表项指向文件表中的一个表项。
- 打开文件的集合是由一张文件表来表示的,所有进程共享这张表。文件表表项包括当前的文件位置、引用计数即当前指向该表项的描述符表项数,以及一个指向v-node表中对应表项的指针。引用计数变为0内核才会删除这个文件表项。
- 所有进程共享v-node表。表项包含stat结构中的大部分信息,如st_mode、st_size成员。
描述符1/4打开不同的文件,有不同的文件表项,以及相对应的v-node:
子进程有父进程描述符的副本,父子进程共享相同的文件表,所以共享相同的文件位置,另外,内核删除相应文件表表项之前,父子进程都必须关闭了它们的文件描述符。
同一个文件open两次,也有不同的文件表项,记录自己的文件位置,但v-node是同一个,这种属于文件共享:
IO重定向: