2015-09-04 78 views
0

下面的代码是从Debian的手动open(2)页面从描述O_TMPFILE标志该段采取:为什么linkat需要路径名而不是文件描述符?

char path[PATH_MAX]; 
fd = open("/path/to/dir", O_TMPFILE | O_RDWR, 
      S_IRUSR | S_IWUSR); 

/* File I/O on 'fd'... */ 

snprintf(path, PATH_MAX, "/proc/self/fd/%d", fd); 
linkat(AT_FDCWD, path, AT_FDCWD, "/path/for/file", 
     AT_SYMLINK_FOLLOW); 

的代码背后的想法是,你创建一个匿名的文件,该文件还没有名字的文件系统,但只是一个文件描述符。这意味着没有人知道该文件并可以访问它。然后你写这个文件。最后,文件通过linkat得到它的名字。之后,文件可见,其他人都可以访问它。这是处理下载文件的完美方式,以确保只有完整的下载文件可以被其他程序使用。

但方式linkat必须被称为看起来破碎的设计给我。 linkat有效吗?它给文件描述符一个名字。这意味着该函数需要两个参数:文件描述符和名称。相反,它不接受文件描述符作为参数,但需要文件的名称,该名称没有名称。这使得有必要依靠已安装的proc文件系统为未命名的文件创建一个名称,以便能够将该名称传递给linkat。这看起来如此有线,我不知道为什么有人发明了这个。

为什么以这种方式实现,为什么会出现不只是一个函数

link_what_ever (int fd, char *name); 
+0

正如你写的O_TMPFILE创建一个匿名文件,没有人知道该文件,并且可以访问它。这就是它的作用,如果存储在该文件中的信息必须保存,则可以简单地创建新文件并将隐藏文件复制到其中。 Linkat与O_TMPFILE没有关联,它创建一个新的链接(也称为硬链接)到一个现有的文件。 – LPs

+0

请勿编辑我的回答以发表评论。 – Barmar

+0

如果我的答案不起作用,你在运行什么内核版本?在Linux 2.6.39中增加了“AT_EMPTY_PATH”。 – Barmar

回答

1

我认为你可以做你想做与AT_EMPTY_PATH标志是什么。

linkat(fd, "", AT_FDCWD, "/path/for/file", AT_EMPTY_PATH); 

当使用此标志时,它会创建一个指向由olddirfd参数标识的文件的链接。

请注意,使用此标志要求调用方拥有CAP_DAC_READ_SEARCH的能力。

0

linkat做什么有效?它给文件描述符一个名字。

不,你的假设是错误的:linkat(2),就像link(2),是为了给一个名字命名的文件(即创建一个硬链接),这是一个有点不同。它的设计目的并不在于为匿名文件命名。相反,它是一个通用接口,允许您为已存在的文件Y创建一个新名称X

你可能会说有人可以实现另一个功能name_anon_file(int fd, char *name),的确如此,但在linkat(2)之上实现它并不难,所以你可以自己动手。

另外,不是每个UNIX变体都支持O_TMPFILE,所以这个函数在一般情况下不会很有用。

+0

如何在不安装proc文件系统的情况下实现'name_anon_file'? – ceving

+0

@ceving它不能。无论哪种方式,如果'/ proc'没有挂载,那么你的状态就很糟糕了,像'ps(1)'和'lsof(1)'这样的东西是行不通的。 –

相关问题