共享文件
已打开文件的描述:
内核使用三个相关数据来描述已经打开的文件。分别是:
1..描述符表:每个进程都有独立的描述符表。他的表项是由进程打开的文件描述符索引的,每个打开的文件描述符指向文件表当中的一项。
2..文件表:打开的文件集合是由一张文件表来表示的所有的进程共享这张表。每个文件表的表项的组成:当前文件的位置,引用计数,一个指向v-node表中对应表项的指针。关闭一个描述符会减少相应文件表表项当中的引用计数,直到这个引用计数为0内核才会删除这个表项。
3.v-node表:所有的进程共享这张表。每个表项包含stat结构当中的大多数信息 包括st_size:包含文件的字节数的大小,st_mode编码了文件访问许可和文件类型。
下面举一个例子:
理解说明:父进程中fork返回子进程的pid(非零),子进程中fork返回0.在调用子进程之前,父进程已经从 abcde.txt 读了一个字符 即c1=a。sleep函数可以将一个进程挂起一段指定的时间,若为sleep(1),该进程后执行;sleep(0)不影响进程执行,当父进程ID为偶数时,父进程中是sleep(0),子进程中是sleep(1)。因此父进程先执行,此时读c2,当前光标在a后面,所有读下一个字符 即c2=b;接下来执行子进程,因为这是父子进程共享文件位置,所以读子进程c2时,光标是在b后面的,因此c2=c (如第一次运行结果所示)