我有一个通过open
函数打开的 int
文件描述符,现在需要删除该文件。
我是否真的需要先获取文件名并调用remove
函数呢?
(例如通过使用在C语言中从文件描述符获取文件名的技术)
或者还有其他仅基于文件描述符的方法来实现此功能吗?(仅限Linux)
我已经搜索了一些资料,但上述答案是我能找到的最好的。
我有一个通过open
函数打开的 int
文件描述符,现在需要删除该文件。
我是否真的需要先获取文件名并调用remove
函数呢?
(例如通过使用在C语言中从文件描述符获取文件名的技术)
或者还有其他仅基于文件描述符的方法来实现此功能吗?(仅限Linux)
我已经搜索了一些资料,但上述答案是我能找到的最好的。
/proc
来查看一个打开的文件描述符(fd)链接到了哪个路径,realpath 可以获取符号链接的完整路径。# ls -l /proc/8701/fd
total 0
lr-x------ 1 root root 64 Apr 23 22:44 0 -> /dev/null
lrwx------ 1 root root 64 Apr 23 22:44 1 -> /dev/null
lrwx------ 1 root root 64 Apr 23 22:44 2 -> /dev/null
lrwx------ 1 root root 64 Apr 23 23:19 20 -> socket:[16204]
lrwx------ 1 root root 64 Apr 23 23:19 21 -> socket:[16205]
lrwx------ 1 root root 64 Apr 23 22:44 3 -> socket:[18743]
l-wx------ 1 root root 64 Apr 23 22:44 4 -> /var/lib/dhcp/dhclient-7a30dd46-5058-47aa-b71e-ff77cfbe4194-wlan0.lease
lrwx------ 1 root root 64 Apr 23 22:44 5 -> socket:[16872]
lrwx------ 1 root root 64 Apr 23 22:44 6 -> socket:[18747]
我不知道有任何基于文件描述符可以删除文件的功能,但是任何这样的功能都必须先获取路径,然后调用unlink
。
在Linux上,文件描述符是进程和目录项之间的关联。目录项是路径(文件名)和inode之间的链接。一个目录项可以与多个文件描述符相关联,一个inode也可以与多个目录项相关联。
当你unlink
一个文件时,你正在删除目录项和inode之间的链接。如果那是最后一个链接,该文件最终将从磁盘中删除(即inode被返回到空闲列表,并且由inode使用的块也被释放)。
根据您的使用情况,如果文件内容不需要(即太大或可能有害),您可以使用fd将文件缩小为0字节。
ftruncate(fd, 0);
remove
和unlink
两个命令可以删除文件,但它们都需要一个路径而不是一个fd。这是有道理的,因为fd本质上只是一个指向读/写/关闭等操作的指针。fd并不一定指向文件系统中的文件,因此在文件描述符上使用“delete”并没有太多意义。这是你的程序创建的临时文件吗?如果是,你可以考虑使用 mkstemp()
:http://pubs.opengroup.org/onlinepubs/009695399/functions/mkstemp.html。如果你需要一个 FILE *
,也可以考虑使用 tmpfile()
:http://pubs.opengroup.org/onlinepubs/009695399/functions/tmpfile.html。
在这种情况下,你不需要担心删除文件的问题。只要你正确地使用 close()
关闭文件,操作系统会负责正确删除它(可能不会立即发生)。
mkstemp
在一个文件系统上创建文件,该文件系统恰好是tmpfs或位于受tmpwatch
清理的目录中,则该文件最终将被删除,但无论使用何种方法创建它都是如此。) - Grisha Levit