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

时间:2018-09-04 15:41:12

标签: c++ linux temporary-files

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

在杀死创建文件的进程时,是否有一种明智的方法来自动删除文件?

说明:

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

例如Windows有一个"delete on close"选项,这意味着当您杀死程序时,它关闭的所有打开文件都会被关闭并自动删除(我认为;我没有尝试过)。如果在某处存在这样的功能,那么从理论上讲,类似的事情显然是可能的。我只想知道是否可以。

5 个答案:

答案 0 :(得分:6)

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

由于/proc/self仅在程序关闭时才会消失,因此名称和文件的寿命就足够长了。

答案 1 :(得分:5)

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

答案 2 :(得分:1)

  

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

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

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

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

  

在杀死创建文件的进程时,是否有一种明智的方法来自动删除文件?

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

创建后,您还可以unlink(2)每个这样的临时文件(使用opencreat)并为其保留文件描述符。然后,当进程终止时,或者close-该文件描述符时,文件资源将被回收。 tmpfile(3)使用了该技巧。

顺便说一句,如果您将LLVM用作JIT转换器,则可以考虑使用libgccjit。它能够生成代码而无需任何输入文件。

此类临时文件无法自动删除,因为某些 other 进程可能会在任意时刻打开它们(按其名称)。这就是为什么Linux不能“关闭时删除”的原因(相反,有传言称Windows仅允许单个进程写入给定文件)。

  

但是可能有一些方法可以标记文件,以便操作系统将其删除。

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

答案 3 :(得分:1)

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

相反,您可能应该要么

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

这似乎是一个相当普遍的问题(我当然已经回答过),但这是对程序可能发生的误解。 SIGKILL将立即在程序无法处理的范围内终止它,并且不会再执行任何操作。 (一些特殊的可以继续运行)

this post on the subject所述

  

SIGKILL将地毯从运行过程中拉出,立即终止。

答案 4 :(得分:1)

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

子进程可以注册以知道其父进程何时被杀死,如下所示:

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

然后当父级被杀死时它将收到SIGUSR1。此时,它可以正常删除文件。