以下代码摘自 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);
AT_EMPTY_PATH
是在Linux 2.6.39中添加的。 - Barmar