2013-02-25 20 views
6

This लेख राज्यों, किकिस सिस्टम/फाइल सिस्टम ओएसओपेन() परमाणु है?

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

"सबसे फ़ाइल सिस्टम पर परमाणु है।" क्या यह सच है (यूनिक्स और विंडोज़ पर)? किस फाइल सिस्टम पर?

docs राज्य कि उल्लेख झंडे यूनिक्स और विंडोज पर उपलब्ध हैं, तो यह एक आकर्षक, पार मंच फ़ाइल लॉकिंग (झंडे O_CREAT और O_EXCL सुनिश्चित करना है कि फोन करने की प्रक्रिया फ़ाइल बनाता है) के लिए विधि की तरह दिखता है।

+3

यह यादृच्छिक पर असफल हो जायेगी एनएफएस फ़ाइलसिस्टम पर भले ही यह माना जाता नहीं है। मुझे संदेह होगा कि अन्य लोग हैं (उदा। जीमेल-एफएस) जो विशिष्टता की गारंटी नहीं देंगे और यह निर्धारित करना मुश्किल होगा कि 'foo.lock' एक अर्थात् उचित माउंट पर है या नहीं। – msw

+1

@msw: अच्छी पकड़।प्रोटोकॉल द्वारा एनएफएस सर्वर, फाइल के लिए "ओपन" स्थिति को बनाए रखने के लिए नहीं, इसलिए एनएफएस पर 'ओ_एक्ससीएल' अर्थशास्त्र (चाहे खुले या बनाने के लिए) दौड़ के अधीन हैं। तकनीकी पृष्ठभूमि के लिए http://lwn.net/Articles/252012/ देखें। –

+1

असल में, [लिनक्स ओपन (2) मैन-पेज] (http://man7.org/linux/man-pages/man2/open.2.html) कहता है "एनएफएस पर, O_EXCL केवल NFSv3 का उपयोग करते समय समर्थित है या बाद में कर्नेल 2.6 या बाद में ", लेकिन फ्रैंकएच द्वारा निर्देशित पोस्ट के लेखक। अभी भी सलाह नहीं है। –

उत्तर

4

के लिए संयुक्त राष्ट्र * एक्स-संगत (प्रमाणित POSIX/आईईईई 1003.1 प्रति OpenGroup के रूप में) प्रणाली, व्यवहार open(2)जनादेश इस के लिए OpenGroups चश्मा के रूप में की गारंटी है। उद्धरण:

O_EXCL
O_CREAT और O_EXCL सेट कर रहे हैं, तो खुला() यदि फ़ाइल मौजूद असफल जाएगा। फ़ाइल के अस्तित्व की जांच और फ़ाइल के निर्माण के लिए चेक परमाणु ओपन() निष्पादित अन्य धागे के संबंध में ओ_एक्ससीएल और ओ_Cआरएटी सेट के साथ उसी निर्देशिका में उसी फ़ाइल नाम का नामकरण करने के संबंध में होगा। यदि O_EXCL और O_CREAT सेट हैं, और पथ एक प्रतीकात्मक लिंक नाम देता है, तो प्रतीकात्मक लिंक की सामग्री के बावजूद, खुले() विफल हो जाएंगे और त्रुटि [EXEXIST] पर सेट करेंगे। यदि O_EXCL सेट है और O_CREAT सेट नहीं है, तो परिणाम अपरिभाषित है।

"आम" संयुक्त राष्ट्र * एक्स और संयुक्त राष्ट्र * एक्स-जैसे सिस्टम (लिनक्स, मैकॉक्स, * बीएसडी, सोलारिस, एईक्स, एचपी/यूएक्स) निश्चित रूप से इस तरह व्यवहार करते हैं।

चूंकि विंडोज एपीआई में open() नहीं है, इसलिए लाइब्रेरी फ़ंक्शन मूल एपीआई के संदर्भ में आवश्यक रूप से पुन: कार्यान्वित किया जाता है लेकिन अर्थशास्त्र को बनाए रखना संभव है।

मुझे नहीं पता कि कौन से व्यापक रूप से उपयोग किए जाने वाले सिस्टम का पालन नहीं करेंगे; क्यूएनएक्स, जबकि पीओएसआईक्स-प्रमाणित नहीं है, के पास open() के लिए अपने दस्तावेज़ों में एक ही कथन है। * बीएसडी मैनपेज स्पष्ट रूप से "परमाणुता" का उल्लेख नहीं करते हैं लेकिन फ्री/नेट/ओपनबीएसडी इसे कार्यान्वित करते हैं। यहां तक ​​कि सिम्बियनोस जैसे एक्सोटिक्स (जो विंडोज़ की तरह संयुक्त राष्ट्र * एक्स-आईएसएच open सिस्टम कॉल नहीं है) परमाणु खुले/निर्माण कर सकते हैं।

अधिक दिलचस्प परिणामों के लिए, है, जो open() है एक ऑपरेटिंग सिस्टम/सी क्रम पुस्तकालय खोजने की कोशिश लेकिन इसके लिए ऊपर अर्थ विज्ञान को लागू नहीं करता है ... और जिस पर पायथन धागे के साथ चलाने के लिए (आप वहाँ गया एमएसडीओएस ...)।

संपादित करें: मेरे पोस्ट विशेष रूप से पर केंद्रित है "जो ऑपरेटिंग सिस्टम open के लिए इस विशेषता है?" - जिसके लिए जवाब है, "उनमें से बहुत सारे"। WRT। फ़ाइल सिस्टम हालांकि करने के लिए, चित्र अलग है क्योंकि नेटवर्क फ़ाइल सिस्टम - चाहे एनएफएस, एसएमबी/CIFS या दूसरों, हमेशा O_EXCL नहीं बनाए रखते हैं के रूप में इस डिनायल ऑफ़ सेवा में परिणाम सकता है (यदि एक ग्राहक एक open(..., O_EXCL, ...) और फिर बस करता है फाइलसेवर से बात करना बंद कर देता है/बंद हो जाता है, हर कोई लॉक हो जाएगा)।

+6

'O_EXCL' ऐसा नहीं करता है। एकमात्र चीज 'O_EXCL' है क्योंकि फ़ाइल मौजूद है और' O_CREAT' निर्दिष्ट है तो कॉल विफल हो जाती है। –

संबंधित मुद्दे