我有一个必须创建临时文件的Linux动态库。这些文件必须具有文件名-无法创建它们并立即取消链接。我也无法拦截SIGINT
和SIGKILL
之类的信号,因为这是其他程序使用的库。
在杀死创建文件的进程时,是否有一种明智的方法来自动删除文件?
说明:
unlink()
时,请不要回答说“您可以unlink()
”。例如Windows有一个"delete on close"选项,这意味着当您杀死程序时,它关闭的所有打开文件都会被关闭并自动删除(我认为;我没有尝试过)。如果在某处存在这样的功能,那么从理论上讲,类似的事情显然是可能的。我只想知道是否可以。
答案 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)每个这样的临时文件(使用open
或creat
)并为其保留文件描述符。然后,当进程终止时,或者close
-该文件描述符时,文件资源将被回收。 tmpfile(3)使用了该技巧。
顺便说一句,如果您将LLVM用作JIT转换器,则可以考虑使用libgccjit。它能够生成代码而无需任何输入文件。
此类临时文件无法自动删除,因为某些 other 进程可能会在任意时刻打开它们(按其名称)。这就是为什么Linux不能“关闭时删除”的原因(相反,有传言称Windows仅允许单个进程写入给定文件)。
但是可能有一些方法可以标记文件,以便操作系统将其删除。
否,不是在Linux或POSIX上。该功能应由应用程序代码提供。
答案 3 :(得分:1)
否,您无法在使用库的程序未运行后删除这些文件,因为使用该库的程序不再运行。
相反,您可能应该要么
这似乎是一个相当普遍的问题(我当然已经回答过),但这是对程序可能发生的误解。 SIGKILL
将立即在程序无法处理的范围内终止它,并且不会再执行任何操作。 (一些特殊的可以继续运行)
SIGKILL
将地毯从运行过程中拉出,立即终止。
答案 4 :(得分:1)
另一种可能的解决方案是fork()
一个子进程。然后通过某种机制将所有临时文件名发送到该过程。
子进程可以注册以知道其父进程何时被杀死,如下所示:
#include <sys/prctl.h>
int ret;
ret = prctl (PR_SET_PDEATHSIG, SIGUSR1);
if (ret)
perror ("prctl");
然后当父级被杀死时它将收到SIGUSR1
。此时,它可以正常删除文件。