2013-02-25 13 views
6

This stany artykuł, żeNa których systemach/systemach plików znajduje się atomowy atom os.open()?

fd = os.open('foo.lock', os.O_CREAT|os.O_EXCL|os.O_RDWR) 

"jest atomowy na większości systemów plików". Czy to prawda (w systemach Unix i Windows)? Na jakich systemach plików?

docs stwierdzają, że wspomniane flagi są dostępne na Unix i Windows, więc wygląda na to kuszące, metody cross-platform dla blokowania plików (flagami O_CREAT i O_EXCL zapewnienia, że ​​proces wywołujący tworzy plik).

+3

To nie powiedzie się losowo na systemach plików NFS, chociaż nie powinno. Podejrzewam, że istnieją inne (np. Gmail-fs), które nie gwarantują wyłączności i byłoby niezwykle trudno określić, czy 'foo.lock' znajduje się na semantycznie prawidłowym uchwycie. – msw

+1

@msw: Dobry połów.Serwery NFS, według protokołu, nie utrzymują stanu "otwartego" dla pliku, dlatego semantyka "O_EXCL" (otwarta lub tworzona) w systemie plików NFS podlega wyścigom. Zobacz http://lwn.net/Articles/252012/ dla zaplecza technicznego. –

+1

W rzeczywistości, strona [Linux open (2) man] (http://man7.org/linux/man-pages/man2/open.2.html) mówi: "W systemie plików NFS O_EXCL jest obsługiwany tylko w przypadku używania NFSv3 lub później na jądrze 2.6 lub nowszym ", ale autor postu wskazał FrankH. nadal radzi nie. –

Odpowiedz

4

UN * X zgodny (certyfikat POSIX/IEEE 1003.1 jak na OpenGroup) systemach zachowanie jest gwarantowana jako OpenGroups Specyfikacje dla open(2)mandatu tego. Cytat:

O_EXCL
Jeśli O_CREAT i O_EXCL są ustawione, open() otrzymuje się niepowodzeniem, jeśli plik istnieje. Sprawdzenie istnienia pliku i utworzenie pliku, jeśli nie istnieje, to atomowa w odniesieniu do innych wątków wykonujących funkcję open(), nazywających tę samą nazwę pliku w tym samym katalogu, co zestaw O_EXCL i O_CREAT. Jeśli ustawione są O_EXCL i O_CREAT, a nazwy ścieżek są dowiązaniami symbolicznymi, funkcja open() zawiedzie i ustawi errno na [EEXIST], niezależnie od zawartości dowiązania symbolicznego. Jeśli ustawiony jest O_EXCL, a O_CREAT nie jest ustawiony, wynik jest niezdefiniowany.

"Popularne" systemy UN * X i UN * X (Linux, MacOSX, * BSD, Solaris, AIX, HP/UX) z pewnością zachowują się w ten sposób.

Ponieważ interfejs API systemu Windows nie ma wartości open(), funkcja biblioteczna musi zostać ponownie zaimplementowana pod względem natywnego interfejsu API, ale możliwe jest zachowanie semantyki.

Nie wiem, które powszechnie używane systemy nie byłyby zgodne z; QNX, chociaż nie ma certyfikatu POSIX, ma to samo oświadczenie w swoich dokumentach dla open(). Strony podręcznika * BSD wyraźnie nie wspominają o "atomowości", ale implementują ją Free/Net/OpenBSD. Nawet egzotyki takie jak SymbianOS (który podobnie jak Windows nie ma wywołania systemowego UN * X-ish open) może wykonać atomowe otwarcie/utworzenie.

Do bardziej interesujących wyników, spróbuj znaleźć bibliotekę wykonania systemu operacyjnego/C, który ma open() ale nie wdrożyć powyższe semantykę dla niego ... i na którym Python byłoby nićmi (dostał się tam, MSDOS ...).

Edytuj: Mój post koncentruje się na "które systemy operacyjne mają tę cechę dla open?" - dla których odpowiedź brzmi "prawie wszystkie". Wrt. do systemów plików chociaż, obraz jest inny, ponieważ sieciowych systemów plików - czy NFS, SMB/CIFS lub innych, nie zawsze zachowują O_EXCL ponieważ może to doprowadzić do zaprzeczenia-of-service (jeśli klient nie jest open(..., O_EXCL, ...) a następnie po prostu przestaje rozmawiać z serwerem plików/jest wyłączony, wszyscy pozostali zostaną zablokowani).

+6

'O_EXCL' tego nie robi. Jedyne, co robi 'O_EXCL', powoduje, że wywołanie kończy się niepowodzeniem, jeśli plik istnieje i podano' O_CREAT'. –

Powiązane problemy