为什么linkat需要路径名而不是文件描述符?

时间:2015-09-04 10:04:36

标签: c linux

以下代码摘自Debian手册页open(2)中描述O_TMPFILE标志的段落:

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);

2 个答案:

答案 0 :(得分:1)

我认为你可以用AT_EMPTY_PATH标志做你想做的事。

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

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

请注意,使用此标记要求调用者具有CAP_DAC_READ_SEARCH功能。

答案 1 :(得分:0)

  

linkat有效做什么?它为文件描述符命名。

不,您的假设是错误的:linkat(2),就像link(2)一样,旨在为文件提供 new 名称(即创建一个硬链接),它是一个有点不同。它的设计没有为匿名文件命名的具体目标。相反,它是一个通用接口,允许您为已存在的文件X创建新名称Y

你可能会争辩说有人可以实现另一个函数name_anon_file(int fd, char *name),而且确实如此,但在linkat(2)之上实现它并不是那么难,所以你可以自己做。

另外,并非每个UNIX变体都支持O_TMPFILE,因此在一般情况下该函数不会有多大用处。