Kiedy dzwonimy pod numer close(<fd>)
, czy automatycznie wykonuje się synchronizację z nośnikiem fizycznym za pomocą fsync()
?Czy close() wywołuje fsync() w systemie Linux?
Odpowiedz
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).
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.)
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.
- 1. Zastępowanie funkcji close() w systemie Linux z moją własną funkcją close()
- 2. fsync, sync: czy naprawdę robi to, co powinno?
- 3. Szukasz wdrożenie systemu wywołuje na jądrze Linux
- 4. Czy komponent wywołuje zdarzenie samozniszczenia
- 5. Dlaczego fsync() zajmuje dużo więcej czasu na jądrze Linux 3.1. * Niż jądro 3.0
- 6. Programowanie kamery w systemie Linux
- 7. Dystrybucja oprogramowania w systemie Linux?
- 8. Profilowanie wydajności w systemie Linux
- 9. Interlocked odpowiednik w systemie Linux
- 10. Błędy Tomcat w systemie Linux
- 11. Wywoływanie Pythona IDLE w systemie Linux
- 12. Do czego służy fsync MongoDB?
- 13. Czy mogę zrobić memcpy kopiowania przy pisaniu w systemie Linux?
- 14. Czy funkcja fopen() jest wątkiem bezpiecznym w systemie Linux?
- 15. Jak sprawdzić, czy katalog istnieje w systemie Linux?
- 16. Czy ColdFusion w systemie Linux/Apache jest stabilny?
- 17. Czy można zmienić rozmiar nazwanego potoku w systemie Linux?
- 18. Czy można zatrzymać pojedynczy wątek podczas debugowania w systemie Linux?
- 19. Czy w systemie Linux proces może wyświetlać GUI innego procesu?
- 20. Czy można wyświetlić postęp sortowania w systemie Linux?
- 21. Czy wątek funkcji gettimeofday jest bezpieczny w systemie Linux?
- 22. Czy kontenery Windows mogą być hostowane w systemie Linux?
- 23. va_list złe zachowanie w systemie Linux
- 24. Przenoszenie plików w systemie Linux w C
- 25. HeapCreate, HeapAlloc w systemie Linux, prywatny przydział dla systemu Linux
- 26. Wątki/Porównanie procesów w systemie Linux/Windows
- 27. monitorować wykorzystanie pamięci programu w systemie Linux
- 28. Liczba operacji na plikach w systemie Linux
- 29. Directory.GetCurrentDirectory() nie działa w systemie Linux?
- 30. Zmień identyfikator użytkownika w systemie Linux
Wywołanie funkcji 'fsync()' * także nie *, z tych samych powodów (sprzęt mógł odroczyć zapis). –
@ 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)? –
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. –