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).
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
@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. –
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. –