可以說,我的程序中有多個功能需要將數據附加到某個文件。我在程序開始時用全局文件句柄打開文件,以便在需要的地方添加它。 (請注意,我知道我可以將文件句柄作爲參數傳遞給函數,但這不是此問題的目的)。在程序開始時打開文件句柄並在最後關閉它是不好的;或者更好的辦法是讓一個函數void AppendFile(char *data_to_append);
,然後打開文件並追加到它並關閉它在這個相同的功能?如果程序死了,FD仍然會被使用是我看到的唯一不好的事情,但同時,如果使用該功能,則會打開和關閉同一文件數百次和數百次。追加到全局文件句柄,它不好嗎?
回答
您可能最好做一個開放和一個關閉。打開/關閉不停會導致大量IO浪費。
儘管使用互斥鎖,您可能會希望保護此功能,因此一次只能有一個線程寫入文件句柄。
請確保儘管最終關閉了您的文件。
如果你的程序是單線程的,沒關係。如果它在文件句柄打開時死掉,它可能會被操作系統關閉。如果不是,那麼要保證它不會死在AppendFile函數中?
雖然我建議你做這個AppendFile函數。它將簡化寫入過程,並且與使用大量fwrite()相比,您可以更輕鬆地更改文件句柄的相關內容。
取決於您對文件的關注程度,而不會被丟棄或丟失數據。如果程序崩潰了,那麼還不能保證所有未完成的寫入(不是完成,而是刷新並提交到磁盤)發生什麼情況。如果有未提交的寫入,他們可能被拋出或半完成。關閉文件可以保證這些寫入被提交。
如果寫入不經常,打開/附加/關閉是一個更好的主意國際海事組織 - 但AppendFile
可以使已經打開的文件句柄,所以它實際上更好地工作任何方式。
除此之外,如果你使用線程,你不想隨機寫入文件 - 你想有一些方法來同步它們。有一個AppendFile
或類似的函數爲您提供了同步點 - 您可以在那裏添加代碼,直到另一個線程完成。當你直接在一百個不同的地方寫文件時,試着去做這件事。
有時一個數據庫,它是文本文件的一個很好的替代品,expecially當數據庫是專門設計來取代在首位:)
看看的SQLite(http://www.sqlite.org/)的文本文件。的SQLite
覺得還不如甲骨文,但作爲fopen()函數
替換如果文件句柄你說的是FILE *
然後在開始打開,並在年底有很多的關閉更換即使有多個線程,用戶也應該按預期工作,只要您在POSIX系統上使用單個stdio函數調用進行寫操作即可。
如果通過文件句柄表示操作系統的公開調用返回的整數,那麼這些通常在對write
(或類似的)的單個調用中是線程安全的,因爲操作系統將鎖定文件,同時將數據傳輸到與該文件。
如果程序是單線程應用程序,那麼您無需擔心任何一種方式。
如果你去與反覆開,追加和關閉文件,你可以,如果使用標準輸入輸出的FILE *
多線程或者如果AppendFile
電話,因爲內的不同FILE *
s就不能共享緩存不知何故遞歸製作陷入困境應用程序以及文件在一個線程中更改時,其他線程可能會覆蓋這些更改。
os文件句柄(打開時返回的整數)會發生類似的情況,因爲對open
的不同調用將產生不同的文件句柄,而不會共享它們的查找位置,因此隨着文件增長,不同的文件描述符將最終結束搜索位置實際上並不在文件末尾,除非您可以在操作系統爲您處理此操作的情況下打開僅附加模式(O_APPEND
)的文件。
反覆打開和關閉文件確實會產生很多額外的工作。
全局變量通常不是一件好事。對於小程序來說,這並不重要。
儘管仍在使用全局文件句柄,但請考慮只通過void AppendFile(char *data_to_append);
函數來訪問它,其中只有AppendFile
引用全局文件,而不是散佈在全部代碼中。
如果經常訪問文件,在每次訪問時打開/關閉文件都可能成爲惡意。另外,當你的程序結束時(通常死亡或正常退出),文件句柄通常是關閉的,所以如果程序崩潰,你不會泄漏任何東西。
- 1. 追蹤文件句柄
- 2. 追加到全局列表
- 3. 多處理和全局文件句柄的怪異行爲
- 4. 寫文件(句柄)的內容,以不同的文件句柄
- 5. 安全追加到文件循環時?
- 6. Perl的文件句柄 - 覆蓋現有數據,而不是追加/刪除
- 7. 文件句柄 - 不會寫入文件
- 8. 在DBMS中追加好嗎?
- 9. NSMutableString不是追加,它全是空
- 10. 全局追加到符合vim條件的行
- 11. python不釋放文件句柄到日誌文件
- 12. PHP:好的將數據庫句柄存儲在全局變量中?
- 13. CLion將頭文件添加到cmake源文件很不好嗎?
- 14. Python管道到`gzip.open`文件句柄
- 15. 別名文件句柄到STDOUT perl
- 16. CGI.pm:子程序之間丟失全局散列中的文件句柄?
- 17. 追加到文本文件
- 18. 文件句柄選項不會出現
- 19. rsyslog不釋放文件句柄
- 20. Java文件句柄將不會關閉
- 21. 石英不能釋放文件句柄
- 22. OpenSSL不會釋放文件句柄
- 23. 全日曆拖動事件的句柄
- 24. 爲什麼追加到列表不好?
- 25. 文件句柄變量?
- 26. 程序文件句柄
- 27. 選擇文件句柄的
- 28. 仿型的文件句柄
- 29. 文件句柄數組
- 30. 釋放java文件句柄
你聽說過'stdout'嗎?它是在啓動時(之前)創建的全局文件句柄,可供使用。 – 2010-09-15 18:36:16
是的,我有,它已被用於其他事情。 – user318747 2010-09-15 19:11:01