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

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

我真的必须先获取文件名称并调用remove ? (例如,通过使用C中从文件描述符获取文件名中的技术)

还是有一些其他的(linux特定的)完全基于文件描述符的方式吗?

我已经search,我能find的最好的就是上面的答案。

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

我不知道任何可以基于文件描述符移除文件的函数,但是任何这样的函数首先必须得到路径,然后调用unlink

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

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

就我所知,只有removeunlink ,这两个都需要一个路径,而不是一个fd。 这虽然有意义, 一个fd本质上只是一个读/写/关闭指针等等.fd不一定是指文件系统上的文件,所以对文件描述符的“删除”没有多大意义。

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

 ftruncate(fd, 0); 

这是一个由程序创建的临时文件吗? 如果是这样,你可能要考虑mkstemp() : http : //pubs.opengroup.org/onlinepubs/009695399/functions/mkstemp.html 。 如果您确定要获取FILE *考虑tmpfile()以及: http : //pubs.opengroup.org/onlinepubs/009695399/functions/tmpfile.html

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