一、结论

  1. 可以同时打开,两个进程中分别产生生成两个独立的fd(**不同的文件描述符**)
  2. 两个进程可以任意对文件进行读写操作,操作系统并不保证写的原子性
  3. 进程可以通过系统调用对文件加锁,从而实现对文件内容的保护
  4. 任何一个进程删除该文件时,另外一个进程不会立即出现读写失败(因为文件不会被真正删除,引用计数还不为0)
  5. 两个进程可以分别读取文件的不同部分而不会相互影响(file不一样)
  6. 一个进程对文件长度和内容的修改另外一个进程可以立即感知(这个描述还是有一点问题,可能是inode会对file进行通知)

    二、文件描述符与打开文件的关系?

    内核中,对应于每个进程都有一个文件描述符表,表示这个进程打开的所有文件。

文件描述表中每一项都是一个指针,指向一个用于描述打开的文件的数据块———file对象,file对象中描述了文件的打开模式,读写位置等重要信息,当进程打开一个文件时,内核就会创建一个新的file对象。需要注意的是,file对象不是专属于某个进程的,不同进程的文件描述符表中的指针可以指向相同的file对象,从而共享这个打开的文件

file对象有引用计数,记录了引用这个对象的文件描述符个数,只有当引用计数为0时,内核才销毁file对象,因此某个进程关闭文件,不影响与之共享同一个file对象的进程
image.jpeg

三、LINUX文件删除

linux系统看到的只是一个引用计数,一旦引用计数为0了,就要删除该文件了,如果有人使用着该文件,那么它的引用计数最起码是1,最起码也要等到该使用者不再使用的时候才可以删除该文件,这样的结果就是当你删除一个文件的时候,你放心的进行删除操作,系统等到没有用该文件的时候执行最终的删除,因此在linux中没有删除不了的文件,linux不对文件的删除处理提供任何的保护,不耦合任何别的机制,删除的语义很简单,就是递减一个引用计数

linux中通过两个引用计数管理了文件的存在与删除,这就是 i_count 以及 i_nlink,前者的意义是当前的使用者,后者的意义是当前的介质链接数量,这二者的意义也可以理解成前者是文件在内存的引用计数,而后者是文件在磁盘的引用计数,只有在二者都为0的情况下,介质的删除操作才真正进行