आप एक ही फाइल को संशोधित करने के लिए कई पर्ल स्क्रिप्ट के बारे में चिंतित हैं, तो सिर्फ फ़ाइल में आपकी रुचि है लॉक करने के लिए हर एक में flock() समारोह का उपयोग करें।
आप बाहरी प्रक्रियाओं, बारे में चिंतित हैं जो आपके पास शायद नियंत्रण नहीं है, आप sysopen() फ़ंक्शन का उपयोग कर सकते हैं। प्रोग्रामिंग पर्ल पुस्तक (जो मेरी सशक्त अनुशंसा, वैसे) के अनुसार:
अधिलेखन की इस समस्या को दूर करने के लिए आपको sysopen
उपयोग करने के लिए है, जो है कि क्या एक बनाने के लिए अधिक व्यक्तिगत नियंत्रण प्रदान करता है की आवश्यकता होगी नई फाइल या क्लॉबर एक मौजूदा है। और हम –e
फ़ाइल अस्तित्व परीक्षण खो देंगे क्योंकि यह यहां कोई उपयोगी उद्देश्य नहीं देता है और केवल दौड़ की स्थिति में हमारे एक्सपोजर को बढ़ाता है।
उन्होंने यह भी कोड के इस नमूना ब्लॉक प्रदान करते हैं:
use Fcntl qw/O_WRONLY O_CREAT O_EXCL/;
open(FH, "<", $file)
|| sysopen(FH, $file, O_WRONLY | O_CREAT | O_EXCL)
|| die "can't create new file $file: $!";
इस उदाहरण में, वे पहली बार में कुछ स्थिरांक में खींच (sysopen
कॉल में इस्तेमाल किया जाएगा)। इसके बाद, वे फ़ाइल को open
के साथ खोलने का प्रयास करते हैं, और यदि यह विफल रहता है, तो वे sysopen
आज़माएं। वे कहते हैं कि करने के लिए पर जारी:
अब भले ही फ़ाइल किसी भी तरह जब खुले विफल रहता है और जब sysopen
की कोशिश करता लेखन के लिए एक नई फ़ाइल को खोलने के लिए, कोई नुकसान , किया जाता है क्योंकि के साथ झंडे प्रदान की के बीच अस्तित्व में स्प्रिंग्स, sysopen
एक फ़ाइल जो पहले से मौजूद है, को खोलने से इंकार कर देगा।
तो, अपनी स्थिति के लिए चीजों को स्पष्ट करना, फ़ाइल परीक्षण पूरी तरह से (कोई और अधिक चरण 1) निकाल सकते हैं और केवल ऊपर ब्लॉक के समान कोड का उपयोग कर खुला आपरेशन करते हैं। समस्या सुलझ गयी!
यह अभी भी समाधान नहीं करता है * सैद्धांतिक रूप से किसी को Stage1 और stage2 * मुद्दे के बीच इस फाइल बना सकते हैं! यह फाइलें खोलने का सिर्फ एक गैर-क्लॉबरिंग तरीका है। – creaktive
यकीन है कि यह करता है। हमने ओपी के प्रश्न से पूरी तरह से "चरण 1" से छुटकारा पा लिया है। अब केवल एक मंच है: फ़ाइल खोलना! –
असहमत होने के लिए खेद है ... 'ओपन (एफएच, "<", $ फ़ाइल) के बारे में क्या || (! नींद 1) || sysopen (...) '? अभी भी दो चरण हैं, आप उन्हें एक ही कथन में डाल दें।कृपया मुझे सुधारें अगर मैं गलत हूं। – creaktive