如何在Linux中删除一个文件,而我只有文件描述符

14

我有一个通过open函数打开的 int文件描述符,现在需要删除该文件。

我是否真的需要先获取文件名并调用remove函数呢? (例如通过使用在C语言中从文件描述符获取文件名的技术

或者还有其他仅基于文件描述符的方法来实现此功能吗?(仅限Linux)

我已经搜索了一些资料,但上述答案是我能找到的最好的。


1
不,没有特别的方式。 - nos
2
不,没有。你有考虑过可能会有多个目录项链接到同一个inode(:=文件)的情况吗? - wildplasser
@wildplasser 没有,我正在上乔治亚理工学院的高级操作系统课程,我想我需要重新学习操作系统101 :) - Eran Medan
5个回答

8
你可以使用 /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]

4

我不知道有任何基于文件描述符可以删除文件的功能,但是任何这样的功能都必须先获取路径,然后调用unlink

在Linux上,文件描述符是进程和目录项之间的关联。目录项是路径(文件名)和inode之间的链接。一个目录项可以与多个文件描述符相关联,一个inode也可以与多个目录项相关联。

当你unlink一个文件时,你正在删除目录项和inode之间的链接。如果那是最后一个链接,该文件最终将从磁盘中删除(即inode被返回到空闲列表,并且由inode使用的块也被释放)。


我认为文件描述符实际上是进程和inode之间的关联,而不是与特定目录条目相关(事实上,在删除相关路径后,可能不会剩下任何目录条目,您可以保留对inode的FD引用)。 - Matthijs Kooijman

3

根据您的使用情况,如果文件内容不需要(即太大或可能有害),您可以使用fd将文件缩小为0字节。

ftruncate(fd, 0);

1
据我所知,只有removeunlink两个命令可以删除文件,但它们都需要一个路径而不是一个fd。这是有道理的,因为fd本质上只是一个指向读/写/关闭等操作的指针。fd并不一定指向文件系统中的文件,因此在文件描述符上使用“delete”并没有太多意义。

0

操作系统会负责正确删除它 - 这并不是真的,你仍然需要取消链接文件。 - Grisha Levit
1
(如果使用mkstemp在一个文件系统上创建文件,该文件系统恰好是tmpfs或位于受tmpwatch清理的目录中,则该文件最终将被删除,但无论使用何种方法创建它都是如此。) - Grisha Levit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接