我有一个Linux动态库,必须创建临时文件。这些文件必须具有文件名 - 无法创建它们并立即取消链接。我也无法拦截像SIGINT
和SIGKILL
这样的信号,因为这是一个其他程序使用的库。
是否有一种理智的方法可以在创建文件的过程被杀死时自动删除文件?
澄清:
unlink()
时,请不要回答说“你可以unlink()
”。例如,Windows有一个"delete on close"选项,这意味着当你编程被杀死时,它已经关闭并自动删除任何打开的文件(我想;我没有尝试过)。如果在某些地方存在这样的功能,那么理论上在Linux上显然是可能的。我只是想知道它是否确实如此。
创建一个文件,然后将/proc/self/fd/X
传递给LLVM,其中X是您的文件描述符。您现在可以取消链接(正如Basile建议的那样),
由于/proc/self
仅在程序关闭时消失,因此名称和文件的存在时间足够长。
虽然这不是特别明智,但Linux允许您通过/ proc / $ pid / fd / $ number传递已删除文件的名称。
我有一个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上。该功能应由应用程序代码提供。
另一种可能的解决方案是fork()
一个子进程。然后通过某种机制将所有临时文件名发送到此进程。
子进程可以注册以了解其父进程何时被杀死:
#include <sys/prctl.h>
int ret;
ret = prctl (PR_SET_PDEATHSIG, SIGUSR1);
if (ret)
perror ("prctl");
当父母被杀时,它会收到SIGUSR1
。此时它可以正常删除文件。
不,在使用您的库的程序未运行后,您无法删除这些因为使用它的程序不再运行。
相反,你可能应该
这感觉就像一个相当普遍的问题(我当然已经拥有它),但它来自对你的程序会发生什么的误解。 SIGKILL
将立即在您的程序可以处理的范围之外终止它,并且不会运行它的进一步操作。 (一些特殊的可以继续运行)
SIGKILL
从您的跑步过程中拉出地毯,立即终止它。