【问题标题】:How to delete a file in Linux where all I have is the file descriptor如何在 Linux 中删除我只有文件描述符的文件
【发布时间】:2014-04-23 21:13:52
【问题描述】:

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

我真的必须先获取文件名并调用remove吗? (例如,通过使用Getting Filename from file descriptor in C 中的技术)

或者是否有其他的(Linux 特定的 OK)方式仅基于文件描述符?

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

【问题讨论】:

  • 不,就是这样。没有什么特别的方法。
  • 不,没有。您是否考虑过可能有多个目录条目链接到同一个 inode (:=file) 的可能性?
  • @wildplasser 不,我没有:/ 我正在 GA tech 学习高级操作系统,我想我需要再次学习 OS 101 :)

标签: c linux


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我不知道有什么函数可以根据文件描述符删除文件,但是任何这样的函数都必须首先获取路径,然后调用unlink

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

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

    【讨论】:

    • 我其实认为文件描述符是一个进程和一个inode之间的关联,与某个特定的目录条目无关(实际上,可能没有任何目录条目留下,你可以保留一个FD到取消链接相关路径后的inode)。
    【解决方案3】:

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

    ftruncate(fd, 0);
    

    【讨论】:

      【解决方案4】:

      据我所知,只有removeunlink,两者都需要路径而不是fd。不过,这是有道理的; fd 本质上只是一个指向读/写/关闭等的指针。fd 不一定引用文件系统上的文件,因此对文件描述符进行“删除”没有多大意义。

      【讨论】:

        【解决方案5】:

        这是由您的程序创建的临时文件吗?如果是这样,您可能需要考虑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清理等的目录下创建文件,那么,是的,该文件最终会被删除,但不管用什么方法创建都是这样)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-10
        • 1970-01-01
        • 2021-11-20
        • 1970-01-01
        • 1970-01-01
        • 2012-10-09
        相关资源
        最近更新 更多