下面的代码是从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);
正如你写的O_TMPFILE创建一个匿名文件,没有人知道该文件,并且可以访问它。这就是它的作用,如果存储在该文件中的信息必须保存,则可以简单地创建新文件并将隐藏文件复制到其中。 Linkat与O_TMPFILE没有关联,它创建一个新的链接(也称为硬链接)到一个现有的文件。 – LPs
请勿编辑我的回答以发表评论。 – Barmar
如果我的答案不起作用,你在运行什么内核版本?在Linux 2.6.39中增加了“AT_EMPTY_PATH”。 – Barmar