我在C中编写了一个文件系统,用于与FUSE接口的家庭作业。到目前为止,我可以挂载我的文件系统,创建和删除文件,列出目录中的文件等,但我对read()
和write()
函数有一些问题。
我的任务规定我的文件系统保留两种打开的文件表,每个进程一个(所以每个进程都有一个打开的文件有自己的打开文件表),还有一个系统范围(每个进程表中的每个条目链接)获取可共享的信息)。当调用read()
或write()
时,将使用调用进程的pid和系统调用中传递的文件描述符参数来查找相应的表条目。
我的问题是FUSE不会在调用read()
或write()
时传递文件描述符,只传递文件的路径,因此我无法在打开的文件表中查找相应的条目。根据建议here,我可以将open()
返回的文件decriptor放在struct fuse_file_info
参数的文件句柄字段中,但我相信struct fuse_file_info
有一对一与我的文件有一个关系,那么那里的文件描述符将始终是最近一次调用open()
所产生的文件描述符,这不一定是与后续调用read()
或{ {1}}。
我能想到解决问题的唯一方法是强制调用我的文件系统write()
和open()
函数来为每次调用FUSE操作创建和删除表条目{ {1}}和close()
。然后我可以将该调用返回的文件描述符传递给read()
到我的文件系统的write()
或open()
函数,但这似乎不太合理。如果可能,我希望调用我的文件系统的read()
和write()
与FUSE操作open()
和{{1}建立一对一的关系}}
我的主熔丝接口如下所示,如果感兴趣,可以找到here:
close()
我想知道是否有人可以提供任何有关我的问题的见解或一般使用FUSE实现打开文件表。非常感谢提前。
答案 0 :(得分:0)
我只是仔细检查了FUSE源,看起来FUSE每个打开的文件句柄分配一次fuse_file_info,因此它是一对一的打开句柄,而不是文件路径。
然而,本着教你钓鱼的精神,您可以轻松自行检查。给自己写一个小的C测试应用程序。在测试中打开相同的文件两次,并在FUSE的fh字段中放入两个不同的数字,然后从每个打开的文件句柄中读取,并查看fh字段中的内容。