簡體   English   中英

您可以安全地讀取作為 mv 命令目標的文件嗎?

[英]Can you safely read a file which is target of mv command?

我聽說 linux 中的 mv 命令是原子的。 但這是否意味着我們可以安全地讀取文件? mv命令完成后我們會一直看到內容嗎?

我有以下情況。 我有不同的進程負責寫入和讀取文件。 我有一個定期運行mv a.txt b.txt的進程和另一個定期運行cat b.txt的進程。 我的問題是, cat b.txt總是避免看到部分文件內容? 即它是否總是會在mv命令之前或之后看到 b.txt 的內容(而不是在寫入之間)? 我認為許多操作系統使用單獨的密鑰進行讀寫,所以我不確定這個過程( mvcat並行)是否安全。

我的另一個問題是 - 如果並行運行mvcat不安全,那么我該怎么做才能確保安全? 我是否需要自己明確使用鎖定文件(使用 fcntl 或其他東西)?

同時調用mvcat是安全的, cat總是會看到mv之前或之后的b.txt的內容。

mv 使用rename(2)系統調用

mv 實用程序應執行與 rename() 函數等效的操作 [...]

rename(2)保證原子性:

如果新參數命名的鏈接存在,則應將其刪除並將舊的重命名為新的。 在這種情況下,一個名為 new 的鏈接在整個重命名操作期間對其他線程保持可見,並且在操作之前引用 new 或 old 引用的文件。

該規范要求函數的操作是原子的。

通過catopen(2)調用的這種保證,它變得原子化:

open() 函數應建立文件和文件描述符之間的連接

也就是說,一旦建立了連接, cat就不會再看到另一個文件了。 POSIX 不保證讀取已重命名的文件不會失敗,但實際上,包括 Linux 在內的 POSIX 實現不會導致讀取失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM