2015-03-02 81 views
4

我有一個正在向數據寫入數據的程序。腳本和C二進制程序之間的競爭條件

C程序在執行過程中並未保持打開文件,只是用(fopen ("myfile.txt","a"))打開文件並寫入一些數據,然後關閉文件。

在另一邊,我有一個腳本文件,就可能在同一時間與C二進制程序做出相同的文件2個操作:

  1. 它可以刪除文件

  2. 它可以添加一些行的文件,命令

    echo "some data" >> file 
    

是否有種族℃的風險在腳本和C二進制程序之間進行? Linux ioctl可以管理這樣的問題嗎?

如果存在競爭狀態的危險,如何使處理文件之前基於C的檢查和殼呢?

+6

是的,這裏有一個競賽條件。 – 2015-03-02 14:20:37

+0

爲什麼選擇投票?這是一個合法的問題。 – jm666 2015-03-02 14:27:03

+0

我認爲你應該使用數據庫而不是文本文件 – 2015-03-02 14:35:38

回答

8

如果兩個進程寫入同一個文件中沒有任何「處理」,總是存在一種競爭狀態。 (可能在統計上很小 - 但仍然存在)。

您可以:

  • 使用OS調用鎖定文件,如fcntlflock(參見例如this qst
  • 創建外部「鎖檔」這樣/some/path/file.lck(內容通常是鎖定進程的主機名和進程ID(pid) - 允許檢測到暫停鎖),並在每次修改原始文件之前檢查它的存在(和/或內容)。修改後,您可以簡單地刪除「鎖定文件」)。它與操作系統級別的鎖定相比要慢得多,但它很容易處理,並且非常方便在shell腳本中「鎖定」)。 (請記住,文件創建始終是原子)。
+0

另請參閱:[mandatory-locking.txt](https ://www.kernel.org/doc/Documentation/filesystems/mandatory-locking.txt)和[locks.txt](https://www.kernel.org/doc/Documentation/filesystems/locks.txt)。 瞭解Linux上文件鎖定類型之間兼容性問題的可能性很重要。 – 2015-03-02 16:37:23

+0

@BrianMcFarland **非常好的文檔。感謝您的鏈接。 – jm666 2015-03-02 16:41:53

0

您需要在C程序和你的shell之間建立某種信號量。

一個做到這一點的最簡單的方法是設置sticky bit上的文件。讓你的程序設置這個值並取消它,並讓bash腳本檢查它是否被設置。如果是這樣,您可以將腳本掛起,直到它未被設置。

要添加該位,您可以使用posix chmod並將1000個八進制添加到文件的權限(並在要刪除它時減去01000)。 要在bash文件中測試它,除其他外,您可以使用find,例如對於名爲foo.txt的文件,您可以執行find . -name foo.txt -perm 1000並查看查找是否返回值。 (我從unix.com的問題中得到了這個片段的想法)。

+2

我在Unix上編程已經很長時間了;我忘了'flock'和'fcntl'。 jm666的答案是像這樣的問題的理想解決方案。我將離開我的答案,因爲它是_a_解決方案,但是提出這個答案是因爲它是解決方案。 – 2015-03-02 14:49:05