2009-04-22 17 views
5

Jeśli któryś z moich procesów otwiera plik, powiedzmy tylko do odczytu, czy OS gwarantuje, że żaden inny proces nie napisze na nim tak jak czytam, być może opuszczając proces czytania z pierwszą częścią stara wersja pliku i druga część nowszej wersji pliku, co sprawia, że ​​integralność danych jest wątpliwa?pliki wielu procesów

Nie mówię o rurach, które nie mają poszukiwań, ale w zwykłych plikach, z opcją szukania (przynajmniej jeśli są otwarte tylko jednym procesem).

Odpowiedz

3

Nie, inne procesy mogą zmienić zawartość pliku jak czytasz. Spróbuj uruchomić "man fcntl" i zignorować rozdział o blokadach "doradczych"; są to "opcjonalne" zamki, które procesy muszą zwracać uwagę tylko wtedy, gdy chcą. Zamiast tego poszukaj "nieobowiązkowych" blokad (niestety POSIX). Te są tymi, które będą chronić Cię przed innymi programami. Spróbuj przeczytać blokadę.

+0

Obowiązkowe zamki nie są pożądaną funkcją, moim zdaniem :) – MarkR

+0

Zgoda! Lepszy byłby projekt aplikacji. Ale jeśli ma chronić plik przed czytelnikami, których nie może kontrolować, to oni są jedyną drogą. –

2

Nie, jeśli otworzysz plik, inne procesy mogą do niego pisać, chyba że używasz blokady.

W systemie Linux można dodać doradczą blokadę na pliku z:

#include <sys/file.h> 

... 

flock(file_descriptor,LOCK_EX); // apply an advisory exclusive lock 
+2

Blokady doradcze są nieprzydatne, chyba że aplikacja do pisania również wyrazi zgodę na ich użycie. –

+0

Blokady doradcze są wystarczające, jeśli masz pewność, że każda zainteresowana strona je śledzi. Należy również pamiętać o potencjalnych problemach z zakleszczeniem, jeśli jeden proces blokuje proces oczekiwania na zwolnienie blokady. – jiggy

+2

Obowiązkowe blokady nie zawsze są możliwe. Na przykład, możesz uruchomić mount z "-o mand" i zmienić niektóre flagi na pliku. – Zifre

2

Każdy proces, który może otworzyć plik do zapisu, może do niego pisać. Zapis może się odbywać jednocześnie z twoimi własnymi zapisami, powodując (potencjalnie) nieokreślone stany.

Twoim zadaniem jako pisarza aplikacji jest zapewnienie, że złe rzeczy się nie zdarzają. Moim zdaniem obowiązkowe blokowanie nie jest dobrym pomysłem.

Lepszym rozwiązaniem nie jest udzielanie prawa zapisu do procesów, których nie chcesz zapisywać do pliku.

Jeśli kilka procesów otworzy plik, będą one miały niezależne wskaźniki plików, aby mogły wyszukiwać() i nie wpływać na siebie nawzajem.

Jeśli plik jest otwierany przez program gwintowany (lub zadanie, które dzieli jego deskryptory plików z innym, bardziej ogólnie), wskaźnik pliku jest również udostępniany, więc musisz użyć innej metody, aby uzyskać dostęp do pliku, aby uniknąć wyścigu warunki powodujące chaos - zwykle funkcje pread, pwrite lub scatter/gather readv i writev.

Powiązane problemy