我是内核编程的新手。我想在linux内核模式下重命名一个文件。我没有找到任何可以做到这一点的直接功能。所以我发现我可以使用vfs_link
创建新的硬链接,vfs_unlink
删除旧的链接。但我不明白如何使用vfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry, struct inode **delegated_inode)
。
在使用struct file* fp
之前说我有vfs_link
。
我理解old_dentry
是fp->f_dentry
。但我并没有破译其他一些参数。
我没有在使用vfs_link
的网上找到任何具体的例子。请帮忙
答案 0 :(得分:2)
你不希望这样做。
内核人总是说“政策不属于内核”。内核应该像userland告诉它一样,但是永远不应该决定做什么,永远不应该做用户区可以轻松组成更复杂的事情的复杂事情。这听起来很像政策。
使用inode和dentries的内核的唯一部分是相应系统调用的实现和非常特殊的模块,如ecryptfs和内核nfsd。对于任何与文件系统无直接关系的内容,您都不应该假设文件系统存在!
除非您正在执行与其他地方无法完成的文件系统相关的任何操作,否则您应该使用userland工具操作文件并通过设备节点或/proc
或{{1}从内核提供数据/读取内容特殊文件(它们实际上就像设备一样,除了通过名称而不是设备号标识)。
现在,如果你真的在做与文件系统相关的事情,你可以轻松查找vfs_link
on lxr.free-electrons.com(或lxr.linux.no)的用法。共有3种用途。它们很可能在整个宇宙中仅有三种用途。
然而不是正确的重命名方式。 是类似的函数vfs_rename
。语义是不同的,因为重命名替换目标而链接没有,也因为它允许重命名目录但不允许链接它们。 /sys
已经四个在整个宇宙中使用 。
至于论据,如果不有vfs_rename
。这将是打开文件的句柄,但您将一个路径链接到另一个路径。 struct file*
是旧文件名,old_dentry
是新文件名,new_dentry
/ new_dir
是应放置dir
的目录,new_dentry
是old_dir
生活的inode(。我真的不知道old_dentry
是什么,但它与nfsd(这是该函数的三个用户之一)有关。 / p>