2013-03-11 17 views

Odpowiedz

9

Nie. Wywołanie close() NIE gwarantuje, że zawartość jest na dysku, ponieważ system operacyjny mógł odroczyć zapis.

Jako uwaga boczna, zawsze sprawdź wartość zwracaną close(). Dowiesz się o wszelkich odroczonych błędach do tego momentu. A jeśli chcesz mieć pewność, że zawartość znajduje się na dysku, zawsze wywołaj numer fsync() i sprawdź także jego wartość zwracaną.

Należy pamiętać o tym, czym jest sklep z akcesoriami. Istnieją urządzenia, które mogą wykonywać wewnętrzne odradzanie zapisu, a zawartość może w niektórych przypadkach zostać utracona (chociaż nowsze urządzenia pamięci masowej zwykle mają superkondensatory, aby temu zapobiec, lub sposoby wyłączenia tej funkcji).

+0

Wywołanie funkcji 'fsync()' * także nie *, z tych samych powodów (sprzęt mógł odroczyć zapis). –

+0

@ FrédéricHamidi 'fsync()' zmusza zapisy do przechowywania, w jakich warunkach fsync nie gwarantuje zawartości na dysku (z wyjątkiem nieparzystych awarii i opóźnień sprzętowych, które nie mogą być kontrolowane w niektórych przypadkach)? –

+0

Może być (i zwykle jest) kolejna warstwa pamięci podręcznej w kontrolerze dysku, więc nawet 'fsync()' nie może zagwarantować, że twoje dane dotarły do ​​rzeczywistego sprzętu. Strona [man] (http://linux.die.net/man/2/close) dla 'close()' wspomina o tym. –

1

nr

Od man 2 close

Udana blisko nie gwarantuje, że dane zostały pomyślnie zapisane na dysku, jak jądro odracza pisze. To nie jest wspólne dla systemu plików, aby opróżnić bufory, gdy strumień jest zamknięty. Jeśli musisz mieć pewność, że dane są przechowywane fizycznie, użyj fsync (2). (Będzie to zależeć od sprzętu na dysku w tym momencie.)

0

Od man 2 close:

Udana blisko nie gwarantuje, że dane zostały pomyślnie zapisane na dysku, jak jądro odracza pisze . Nie jest to wspólne dla systemu plików do opróżniania buforów po zamknięciu strumienia . Jeśli chcesz mieć pewność, że dane są fizycznie przechowywane, użyj fsync (2). (Będzie to zależeć od dysku twardego-ware w tym momencie.)

Aby odpowiedzieć na to pytanie, NO, close() nie gwarantuje fsync()

close zamyka tylko deskryptor pliku dla procesu i usuwa wszelkie blokady rekordów związane z procesem.

Powiązane problemy