2011-06-12 141 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

相關問題