|
以下摘自<操作系统设计与实现>
为什么我们不使用一个与文件描述符数组相平行的数组来给出文件当前位置呢?这个想法不可取,但是原因就更微妙了.问题来自Fork系统调用的语义 . 当生成一个进程时,父进程和子进程必需共享打开文件的指针.
为了更好地理解这个问题,我们考虑一个其输出重定位到某文件的shell脚本. 当该shell生成第一个子进程时,其标准输出文件的位置为0. 然后,子进程继承该位置,输出1k数据. 在子进程结束之后,共享文件位置应为1k.
假设shell读取更多的shell脚本,并且生成另一个子进程,第二个子进程必须从shell中继承1k的文件位置.这样,第二个子进程接着在第一个子进程的位置之后输出.如果shell不和子进程共享文件位置,那么第二个子进程可能重写第一个子进程的输出,而不是在第一个子进程的输出之后追加数据.
所以我们也不能把文件位置放在进程表中,它必需真正地实现共享.在minix中,解决这个问题的方法是引入一个新的共享表filp,其中包含了所有的文件位置.filp的使用,通过真正地共享文件位置,fork语义能正确地实现了,shell脚本也能正常工作了.
在第一段中提到的fork系统调用的语义是什么?
在倒数第二段中,"如果shell不和子进程共享文件位置,"不明白,为什么会出现这样的情况,在倒数第三段中子进程可以继承该位置,想问一下是否继承如何决定?
倒数第一段中说要实现真正的共享,这之前 为什么不叫真正的共享,区别在什么地方?
谢谢! |
|