首页 > 试题广场 >

若文件f1的硬链接为f2,两个进程分别打开f1和f2,获得对

[单选题]
题目来源于王道论坛

若文件f1的硬链接为f2,两个进程分别打开f1f2,获得对应的文件描述符为fd1fd2,则下列叙述中,正确的是

Ⅰ.f1f2的读写指针位置保持相同

Ⅱ.f1f2共享同一个内存索引结点

Ⅲ.fd1fd2分别指向各自的用户打开文件表中的一项



  • 仅Ⅲ
  • 仅Ⅱ、Ⅲ
  • 仅Ⅰ、Ⅱ
  • Ⅰ、Ⅱ和Ⅲ
推荐

解析:

硬链接指通过索引结点进行连接。一个文件在物理存储器上有一个索引节点号。存在多个文件名指向同一个索引节点,Ⅱ正确。两个进程各自维护自己的文件描述符,Ⅲ正确,Ⅰ错误。所以选择B

发表于 2018-06-16 11:02:29 回复(7)
硬链接(hard link, 也称链接)就是一个文件的一个或多个文件名。
使用目的:多个文件名能同时修改同一个文件
一个文件有几个文件名,我们就说该文件的链接数为几。链接数可以是1, 这表明该文件只有一个文件名。
A错误,假设有硬链接甲和乙,甲要读文件第一个字节,乙要读文件最后一个字节,这时甲的读写指针指向文件第一个字节,乙的文件指针指向最后一个字节。


发表于 2018-12-17 22:28:10 回复(2)
王道的书或者课本对此描述的不全面
事实上进程打开文件表指向一个File结构体对象(准确的说是多个file对象构成的双向链表中的对应的一个。课本中的系统打开表实际指的是该链表),file中包括了文件打开模式,读写位置,fd引用数f_count(引用了该file对象的文件描述符个数,比如fork后的父子进程以及dup给其它进程后,此时这些进程之间的读写位置指针是共享的,前者fd可以相同,后者fd可以不同),指向dentry结构体对象的指针等信息。而dentry对象指向内存索引结点(含进程访问计数ActiveNode[k].i_count)。

一般来说:不同进程打开同一文件(这里硬链接文件磁盘上等同)时系统会创建不同的file对象(自然读写位置指针就各自进程维护了),但这两个file对象的dentry指针指向同一个dentry(也就是指向内存索引结点)。

多说一句:为什么用多个file双向链表作为事实上的系统打开表呢?
书中的表述是当系统文件打开表的某文件进程引用数为0时(也就是没有进程再访问该文件时)删除该表项,但实际情况是有差异的:

比如同一进程可以多次打开同一个文件,这样每次打开都会为该进程创建不同的file对象(读写位置指针也彼此独立,返回的fd也不同),但都指向同一个dentry(也就是指向同一内存索引结点)。---------可以看到这种情形下该进程建立一个打开联系并不适用于书中的文件进程引用数加一情形(加到了内存索引结点的访问计数i_count上了)。此时即使只有一个进程,但由于打开文件次数多个,因而只有在这些链接到该内存索引结点的file对象个数(对应的i_count)为0时才能删除内存索引结点

值得注意的是:先fopen再fork,子进程完全复制父进程的用户文件打开表,此时父子进程的fd相同,指向同一个file对象,也意味着读写位置指针相同。但要是先fork再fopen的话由于fork返回了2次,因而父进程与子进程各自创建了自己的file对象(fd不同),也意味着读写位置指针不同互相独立,但依然指向的是同一个内存索引结点
编辑于 2020-06-07 11:57:21 回复(0)
这道题当年死了多少考生
发表于 2020-07-25 14:43:21 回复(0)
硬链接指通过索引结点进行连接。一个文件在物理存储器上有一个索引节点号。存在多个文件名指向同一个索引节点。两个进程各自维护自己的文件描述符,
发表于 2019-04-21 10:42:18 回复(0)
“文件f1的硬连接为f2”?硬链接不是一种共享方式么?方式是f2???哦,还是说f1的别名是f2,两者共用索引节点。所以,这道真题到底考什么?我有点懵⚆_⚆?
发表于 2019-11-15 18:02:24 回复(1)
我是这样理解的
在Ubuntu上,wps程序可以同时打开一个文档,但是必有一个打开状态下为只读权限。
选项AC天然互斥,既然读写的指针能够各自指向文档的同一个位置,那就不能分别指向文件中的一项。
读写指针相当于写word文档的时候,那个活动光标。一个文档中的光标有且只有一个。就像微观上,操作系统能够同时响应两个鼠标的操作。
根据生活中的经验,最后选择了BC。

发表于 2020-12-19 19:24:07 回复(0)