在库被杀死时自动删除库创建的文件

问题描述 投票:1回答:5

我有一个Linux动态库,必须创建临时文件。这些文件必须具有文件名 - 无法创建它们并立即取消链接。我也无法拦截像SIGINTSIGKILL这样的信号,因为这是一个其他程序使用的库。

是否有一种理智的方法可以在创建文件的过程被杀死时自动删除文件?

澄清:

  1. 这些确实是我的约束。当我在问题中说我不能unlink()时,请不要回答说“你可以unlink()”。
  2. 我意识到这将需要操作系统支持 - 显然当我的程序被杀死时,它无法运行任何代码本身来删除文件。但是可能有某种方法来标记文件,以便操作系统删除它们。

例如,Windows有一个"delete on close"选项,这意味着当你编程被杀死时,它已经关闭并自动删除任何打开的文件(我想;我没有尝试过)。如果在某些地方存在这样的功能,那么理论上在Linux上显然是可能的。我只是想知道它是否确实如此。

c++ linux temporary-files
5个回答
6
投票

创建一个文件,然后将/proc/self/fd/X传递给LLVM,其中X是您的文件描述符。您现在可以取消链接(正如Basile建议的那样),

由于/proc/self仅在程序关闭时消失,因此名称和文件的存在时间足够长。


5
投票

虽然这不是特别明智,但Linux允许您通过/ proc / $ pid / fd / $ number传递已删除文件的名称。


1
投票

我有一个Linux动态库,必须创建临时文件。

您可以使用atexit(3)注册一个处理程序,该处理程序将在exit(3)时间(或main的正常终止)删除所有这些临时文件。当然,这对信号无效。

您可以在某些tmpfs文件系统中创建这些文件。然后他们将在关机时删除。

如果您遵循关于这些文件的一些命名约定,您还可以使用一些清理脚本(由某些crontab条目触发)发布您的库。

是否有一种理智的方法可以在创建文件的过程被杀死时自动删除文件?

不一般(并且不能有一个POSIX文件语义)。您可以编写一个清洁程序(可能使用inotify(7)工具)从外部运行(例如,作为crontab作业,或作为一些守护程序)。

您也可以在创建后使用unlink(2)open对每个此类临时文件进行creat并为其保留文件描述符。然后,当进程终止时,或者当close-s该文件描述符时,回收文件资源。这个技巧被tmpfile(3)使用。

顺便说一句,如果你使用LLVM作为JIT翻译器,你可以考虑使用libgccjit。它能够生成没有任何输入文件的代码。

这样的临时文件无法自动删除,因为其他一些进程可以在任意时刻打开它们(按名称)。这就是为什么Linux不能“关闭时删除”(相反,传闻Windows只允许一个进程写一个给定的文件)。

但是可能有某种方法来标记文件,以便操作系统删除它们。

不,不是在Linux或POSIX上。该功能应由应用程序代码提供。


1
投票

另一种可能的解决方案是fork()一个子进程。然后通过某种机制将所有临时文件名发送到此进程。

子进程可以注册以了解其父进程何时被杀死:

#include <sys/prctl.h>
int ret;
ret = prctl (PR_SET_PDEATHSIG, SIGUSR1);
if (ret)
        perror ("prctl");

当父母被杀时,它会收到SIGUSR1。此时它可以正常删除文件。


1
投票

不,在使用您的库的程序未运行后,您无法删除这些因为使用它的程序不再运行。

相反,你可能应该

  • 在库的正常操作中检查过时/超大/剩余的临时文件(下次运行时清除)
  • 创建一个单独的程序,为您管理这些(定期清理)

这感觉就像一个相当普遍的问题(我当然已经拥有它),但它来自对你的程序会发生什么的误解。 SIGKILL将立即在您的程序可以处理的范围之外终止它,并且不会运行它的进一步操作。 (一些特殊的可以继续运行)

正如this post on the subject所说

SIGKILL从您的跑步过程中拉出地毯,立即终止它。

© www.soinside.com 2019 - 2024. All rights reserved.