2011-06-12 97 views
2

也许我错了,但我确信有一些工具由UNIX和C标准库提供,让操作系统在进程退出时删除文件。但我不记得它叫什么(或者我想象它)。在我的特殊情况下,我想从perl访问这个功能。在退出时删除文件

Java有deleteOnExit函数,但我知道删除是由JVM完成的,而不是操作系统,这意味着如果JVM不干净地退出(例如电源故障),那么文件将永远不会被删除。

但是我理解我找的工具(如果存在的话),因为它是由操作系统提供的,所以操作系统会在文件被删除后进行查看,大概是在断电等情况下对操作系统启动做一些清理工作。当然,这个过程会不洁净地进行清理。

回答

4

如果您正在寻找一些操作系统可能会在电源故障后自动重新启动的问题,那么END块是不够的,您需要创建操作系统需要临时文件的文件。一旦你这样做,你应该使用File::Temp例程之一(如果你愿意的话,它甚至可以提供打开并立即取消链接文件的选项)。

10

一个非常非常简单的解决这个(即只适用于* nix系统)是:

  1. 创建和打开文件(保持文件句柄周围)
  2. 立即呼救unlink上的文件
  3. 当你感觉它

那么你的程序完成后,文件描述符被关闭,该文件被删除,真正继续正常使用的文件句柄,并退出。如果程序崩溃,这甚至会起作用。

当然,这只能在单个脚本的上下文中工作(即其他脚本将不能直接操作文件,尽管您可以将它们传递给文件描述符)。

+0

有趣的技巧,但我认为我们必须记住,通过删除临时文件,您可能会遇到File :: Temp等竞争条件。 – 2012-11-15 17:45:59

2

您正在寻找atexit()。在Perl中,通常使用END块来完成。 Java和Perl提供他们自己的,因为他们想要移植到不遵循相关标准的系统(在这种情况下是C90)。

那就是说,在Unix上常见的约定是open一个文件然后unlink它;当最后一个引用(也就是你的文件描述符)关闭时,内核将删除它。你几乎总是想打开读取和写入。

2

我认为您正在寻找一个名为tmpfile()的函数,它在调用时创建文件并在关闭时删除它。检查,article

+2

在Perl中,库是[File :: Temp](http://p3rl.org/File::Temp),并且需要的行为通过'UNLINK => 1'参数启用。 – daxim 2011-06-12 18:02:23