2012-01-05 57 views
3

經過大量研究,也無法找到我的問題的解決方案後,我決定在這裏發佈stackoverflow。檢查另一個程序是否有文件打開

那麼我的問題是一種不同尋常的,所以我想這就是爲什麼我無法找到任何答案:

我有一個程序,被記錄的東西到一個文件中。然後我有另一個負責轉移該文件的人。最後,我有第三個獲取文件並對其進行處理。

我的問題是: 文件傳輸程序需要在文件仍在錄製時發送文件。問題是當文件傳輸程序到達文件的末尾時並不意味着該文件實際上是完整的,因爲它仍在被記錄。

這將是很高興有一些東西來檢查,如果記錄器仍然打開文件,或者如果它已經關閉它可以判斷文件的結尾是否真的是文件的真正結束,還是隻是沒有'還有待讀的數據。

希望你能幫助我解決這個問題。也許你對如何解決這個問題有另一個想法。

預先感謝您。

GeKod

+0

也許'inotify'?它可以在文件關閉時通知您。 – cha0site 2012-01-05 09:50:41

+0

similar/duplicate - http://stackoverflow.com/questions/1087204/how-can-i-tell-if-a-file-is-open-elsewhere-in-c-on-linux – 2012-01-05 09:56:34

+0

你可以修改作者的來源? – alk 2012-01-05 10:03:56

回答

1

簡單地說 - 你不能沒有使用文件系統通知機制,Windows,Linux和OSX都有這種味道。我忘記了Windows如何做到了,但是linux有'inotify',而osx有'knotify'。

處理這個問題的簡單方法是,記錄到一個tmp文件,當記錄完成後,將文件移動到'準備傳輸文件'目錄中,如果你這樣做,以便文件當你做這個動作的時候,它們是在同一個文件系統上,它將是原子性的並且可以即時確保你的傳輸實用程序「看到」一個新文件時,它將完全形成並準備就緒。

或者,只是讓您的tmp文件沒有擴展名,然後在完成後將文件重命名爲傳輸代理正在輪詢的擴展名。

+0

嗨,謝謝你的回覆。簡單的方法不適用於我我認爲問題是文件需要在記錄時傳輸。我不能等到文件完整記錄才能發送。 – gekod 2012-01-05 10:02:16

+0

*通知家族中的某個東西可能是您最好的選擇 - 否則您必須輪詢更改,並在文件完成時出現某種超時情況,我相信您已經考慮過這種情況。 – synthesizerpatel 2012-01-05 10:25:09

+0

是的,我其實已經考慮過輪詢文件大小的變化,但它似乎並不是一個乾淨的解決方案。再次感謝:) – gekod 2012-01-05 10:29:34

0

您是否考慮過在記錄器程序和抓取記錄的數據/文件之間使用流接口?如果你有權訪問流接口(比如OS /堆棧服務),它也提供了流信號/原語的可靠結束,你可以考慮替換文件接口。

0

C中沒有可用的函數/庫來執行此操作。但是一個簡單的選擇是在活動結束後重命名文件。例如,記錄儀可以打開該文件的名稱 - file.record一次帶錄製完成,它可以重命名file.recordfile.transfer和傳輸程序應該尋找file.transfer轉移,一旦轉讓完成,就可以將文件重命名爲file.read和讀者可以閱讀並最終將其重命名爲file.done

+0

感謝您的回答。正如已經提到的,我不能等到文件完整記錄。記錄和傳送需要同時進行。 – gekod 2012-01-05 10:03:55

0

你可以檢查文件是否打開或不如下

FILE_NAME="filename" 
FILE_OPEN=`lsof | grep $FILE_NAME` 

// if [ -z $FILE_NAME ] ;then 
    // "File NOT open" 
// else 
    // "File Open" 

參考http://linux.about.com/library/cmd/blcmdl8_lsof.htm

+0

這需要數小時 – 2012-10-25 12:08:57

0

我想諮詢鎖會有所幫助。因爲如果使用另一個程序正在處理的文件,則會被阻止或出現錯誤。但是如果您訪問該文件的行爲是Okey,但結果是不可預知的,爲了保持一致性,所有想要訪問該文件的進程都應該遵守諮詢鎖定規則。我認爲這將起作用。

當文件關閉時,鎖也被釋放。其他進程可以嘗試保存該文件。