天天看點

目的檔案已不在原目錄,程式還會繼續執行寫檔案操作嗎?

最近,在現場調試程式的同僚回報回了一個問題:目的檔案已不在原目錄,程式還會繼續執行寫檔案操作。我們了解了一下,具體的情況是這樣的:某軟體(運作在Linux下)有一個功能是在配置好的某個目錄中生成檔案,在檔案生成的過程中,現場同僚将已經生成的檔案移動到了另外一個目錄中;過了一段時間後發現,程式繼續向移動之後的檔案中寫入内容,導緻該檔案不斷增大。

為了還原現場問題,我們編寫了以下程式:

該程式命名為“WriteFileNonStop.c”,其實作的功能是:每隔10秒向目前使用者的“zhouzhaoxiong/zzx/WriteFileNonStop/File/”目錄下的“File.txt”檔案中寫入“hello, world!”。我們之是以要用一個“while”循環來不斷地寫檔案,就是為了檢視在我們将檔案移走或删除之後,程式會怎麼處理。

利用“gcc -g -o WriteFileNonStop WriteFileNonStop.c”指令編譯程式之後,生成了“WriteFileNonStop”檔案。接下來,我們要複現現場的問題。

1.執行“WriteFileNonStop”指令,可以看到程式運作正常,并且在“zhouzhaoxiong/zzx/WriteFileNonStop/File/”目錄下有檔案生成。

程式運作情況:

檔案生成情況:

2.我們将生成的“File.txt”檔案移動到其它目錄中,可以看到程式繼續運作,并且檔案中繼續有内容生成。

3.我們将“File.txt”檔案删除掉,可以看到程式繼續運作,但沒有檔案生成。

4.為了對程式進行更全面的驗證,在寫檔案的過程中,我們将檔案移動到另外一個Linux使用者下(即目前使用者下的程式無法通路另外一個使用者),發現程式依然繼續運作,但沒有檔案生成。

通過以上測試驗證的結果,我們得出了以下的結論:

第一,C語言中的寫檔案操作是通過檔案句柄來向對應的檔案中寫入内容的,如果程式有通路檔案句柄的權限,那麼不管檔案放在哪個目錄下,都能夠成功寫入。

第二,在寫檔案的過程中,如果将檔案删除,或者是放到了程式無權通路的目錄下,那麼程式也不會報錯,而是繼續執行。是以,對于需要寫檔案的軟體來說,一定要確定相關目錄下的檔案不會被誤移動或誤删除。

繼續閱讀