2013-10-29 12 views
0

我正在使用一個使用qdbm來維護鍵值存儲的程序(將qdbm鏈接到程序中)。在某些情況下,進程會在qdbm數據庫中添加一個值,然後通過調用外部init腳本(通過system())重新啓動它自己。看來有時寫入qdbm數據庫的值實際上並沒有粘住,我想知道是否可能是由於在通過SIGTERM終止進程之前數據沒有被刷新到磁盤。由於qdbm使用write()系統調用(相對於fwrite()庫函數)寫入數據,所以我認爲Linux內核應該知道最終將所有內容刷新到磁盤(系統不會重新啓動,只是過程)。另外,在進程被終止之前,close()在FD上被調用。如果進程被終止,將通過write()寫入的數據刷新到磁盤上嗎?

所以,我的理解是正確的,或者我需要添加一些fdatasync()或類似的調用在那裏的某個地方?此處的權威引用關於語義的鏈接也將被讚賞。

+0

https://www.gnu.org/software/libc/manual/html_node/Termination-Internals.html#Termination-Internals是您想要的權威參考嗎?引用:*請注意,流程終止時不會自動刷新流;請參閱Streams上的I/O * –

回答

0

通常情況下,已經寫的應用程序到內核緩衝區write()的數據將不會被應用程序退出或以任何方式被殺的影響。退出或獲取殺死隱式關閉所有文件描述符,所以應該沒有區別,內核將在之後處理刷新。所以沒有fdatasync()或類似的電話是必要的。

有兩個例外:

  • 如果應用程序使用用戶級緩衝(不調用write()系統調用,而是緩存中的數據在用戶空間的緩衝區,以fwrite())那些緩衝區可能不會被刷新,除非執行了適當的用戶空間文件關閉 - 被SIGKILL殺死肯定會導致您丟失那些緩衝區的內容,如果內核也死掉(功耗,內核崩潰等),您的數據可能錯過了寫入t o內核緩衝區中的磁盤,然後會丟失。

+0

我真的希望獲得權威的參考,但我想我必須採取我能得到的結果。 – jjlin

相關問題