C 如何在Linux中删除只有文件描述符的文件

C 如何在Linux中删除只有文件描述符的文件,c,linux,C,Linux,我有一个先前打开的int文件描述符(通过open),我需要删除该文件 我真的必须首先获取文件名并调用remove? (例如,通过使用中的技术) 或者是否有其他(特定于linux的OK)方法可以完全基于文件描述符来实现这一点 我已经搜索过了,我能找到的最好的答案就是上面的答案。据我所知,只有删除和取消链接,这两种方法都需要路径而不是fd。这是有道理的;fd本质上只是一个指向读/写/关闭等的指针。fd不一定是指文件系统上的文件,因此对文件描述符使用“delete”没有多大意义。您可以使用/proc查

我有一个先前打开的
int
文件描述符(通过
open
),我需要删除该文件

我真的必须首先获取文件名并调用
remove
? (例如,通过使用中的技术)

或者是否有其他(特定于linux的OK)方法可以完全基于文件描述符来实现这一点


我已经搜索过了,我能找到的最好的答案就是上面的答案。

据我所知,只有
删除
取消链接
,这两种方法都需要路径而不是fd。这是有道理的;fd本质上只是一个指向读/写/关闭等的指针。fd不一定是指文件系统上的文件,因此对文件描述符使用“delete”没有多大意义。

您可以使用
/proc
查看打开的fd链接到哪个路径,并获取符号链接的完整路径

# 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]

我不知道有什么函数可以基于文件描述符删除文件,但任何此类函数都必须首先获取路径,然后调用
取消链接

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


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

这是由您的程序创建的临时文件吗?如果是这样,您可能需要考虑<代码> MKSTUNVE()/<代码>:如果你可以得到一个<代码>文件*/COD>考虑<代码> TMPFILE()/<代码>:


在这种情况下,您不需要担心删除文件。只要您正确地
close()
文件,操作系统将负责正确地删除它(可能不会立即发生)。

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

ftruncate(fd, 0);

不,就这样。没有特别的方法,没有。你有没有考虑过可能有多个目录条目链接到同一个inode(:=文件)?@wildplasser没有:/我正在GA tech学习高级操作系统,我想我需要再次学习OS 101:)我实际上认为文件描述符是进程和inode之间的关联,与一个特定的目录条目不相关(事实上,可能没有任何目录条目了,您可以在取消相关路径的链接后保留一个指向inode的FD)。