以下代码摘自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);
答案 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
,因此在一般情况下该函数不会有多大用处。