2015-04-13 3 views
9

मैं घंटों के लिए पढ़ रहा हूं लेकिन समझ नहीं पा रहा हूं कि दो ताले के बीच अंतर क्या है। एकमात्र चीज जो मैं समझता हूं वह यह है कि fcntl() लॉक एक दानेदार लॉक की पेशकश कर रहा है जो विशिष्ट बाइट लॉक कर सकता है और केवल fcntl() एनएफएस लॉकिंग का समर्थन करता है।`fcntl` और` flock` के साथ लॉक करने के बीच क्या अंतर है?

ऐसा कहा जाता है कि अंतर उनके अर्थशास्त्र में है, dup() या fork() द्वारा डुप्लिकेट किए जाने पर वे व्यवहार कैसे करते हैं, लेकिन मुझे समझ में नहीं आता कि अभ्यास में क्या अंतर है।

मेरे परिदृश्य है कि मैं एक fork() आधारित सर्वर, जहां हर काँटेदार प्रक्रिया एक ही फाइल को लिख रहा है जब कुछ होता है में एक लॉग फ़ाइल के लिए लिख रहा हूँ है। मैं flock() का उपयोग क्यों करना चाहूंगा और मैं fcntl() ताले का उपयोग क्यों करना चाहूंगा?

+0

लिनक्स के लिए पिछला प्रश्न मिला। दिलचस्प जवाब Posix भी उल्लेख करता है। http://stackoverflow.com/questions/22409780/flock-vs-lockf-on-linux –

+0

'झुंड()' और 'लॉकफ़() 'दो अलग-अलग चीजें हैं,' लॉकफ़()' आमतौर पर 'fcntl() ' , और मैं पूछ रहा था कि वास्तव में अर्थशास्त्र क्या हैं (बंद करने और गुजरने के संबंध में व्यवहार)। – Quaker

+0

जो लिंक मैंने लिंक किया है, वह शुरू होता है * "झुंड() और लॉकफ() के बीच व्यावहारिक अंतर अर्थशास्त्र (समापन और उत्तीर्ण होने के संबंध में व्यवहार) में है" और 'लॉकफ()' 'fcntl() 'को लपेट सकता है' जवाब प्रासंगिक है। –

उत्तर

5

मैं उपलब्ध प्रलेखन के आधार पर मतभेद यह पता लगाने की कोशिश की और (कृपया मुझे सही कर अगर मैं गलत हूँ) ले लिया निम्नलिखित निष्कर्ष है

fcntl साथ

() (इसे POSIX):

  • आप प्रक्रिया आईडी सहित फाइल सिस्टम स्तर पर फ़ाइल पर लॉक रिकॉर्ड बनाते हैं।

  • यदि प्रक्रिया इस फ़ाइल में किसी भी दायरलेखक को मर जाती है या बंद कर देती है, तो लॉक रिकॉर्ड सिस्टम द्वारा हटा दिया जाता है।

  • फ़ाइल डिस्क्रिप्टर लेखन पहुंच के साथ खोला नहीं गया था, तो एक विशेष लॉक के लिए अनुरोध विफल हो जाएगा।

  • बस: fnctl ताले एक प्रक्रिया के रूप में काम < -> फ़ाइल संबंध, अनदेखी filedescriptors

झुंड() (बीएसडी) अलग है (लिनक्स: कर्नेल 2.0, झुंड() के बाद से अपनी ही में एक सिस्टम कॉल के रूप में लागू करने के बजाय सही रूप में एक फोन fcntl को GNU सी पुस्तकालय में नकल करते जा रहा है):

  • झुंड() सिस्टम के "फ़ाइल खोलें विवरण" पर ताले पैदा करता है। "खुले फ़ाइल विवरण" खुले() कॉल द्वारा उत्पन्न होते हैं।

  • एक दायरस्क्रिप्टर (एफडी) "ओपन फाइल विवरण" का संदर्भ है। डुप्ली() या कांटा() द्वारा उत्पन्न एफडी "वही फ़ाइल विवरण" देखें।

  • एक प्रक्रिया खोलने() फ़ाइल के बाद एक फ़ाइल के लिए एकाधिक "फ़ाइल खोलें विवरण" उत्पन्न हो सकता है कई बार

  • झुंड() देता है यह एक एफडी के माध्यम से ताले एक "ओपन फ़ाइल विवरण"

    पर
  • इसलिए फ्लॉक() का उपयोग प्रक्रियाओं के साथ-साथ धागे (एक अयस्क अधिक प्रक्रियाओं में) के बीच फ़ाइल पहुंच को सिंक्रनाइज़ करने के लिए किया जा सकता है।

  • flock(2) और विशेष रूप से open(2) मैन पेज "ओपन फ़ाइल विवरण" के विवरण के लिए देखें।

आपका परिदृश्य में आप शायद fcntl() आधारित ताले, उपयोग करने के लिए क्योंकि आपके काँटेदार प्रक्रियाओं (खुलेगी) अपने दम पर लॉगफ़ाइल और एक संभवतः रखा लॉक के साथ एक filedescriptor वारिस की उम्मीद नहीं करना चाहती।

यदि आपको एकाधिक धागे के बीच सिंक्रनाइज़ेशन की आवश्यकता है, तो संभवतः एक से अधिक प्रक्रियाओं में, आपको फ्लॉक() आधारित ताले का उपयोग करना चाहिए यदि आपका सिस्टम fcntl() द्वारा अनुकरण के बिना उनका समर्थन करता है। फिर प्रत्येक थ्रेड को डुप्ली() एड या फोर्क() एड हैंडल का उपयोग करने के बजाय फ़ाइल खोलने की आवश्यकता होती है।

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