2015-12-21 4 views
7

मुझे एक लॉक फ़ाइल बनाने की आवश्यकता है जिसे अन्य स्क्रिप्ट या प्रक्रियाओं द्वारा हटाया नहीं जा सकता है। मैं इस की कोशिश की:बाहरी प्रक्रियाओं के विरुद्ध फ़ाइल को लॉक कैसे करें

$f = fopen($pidFile, 'w'); 
    fwrite($f, getmypid()); 
    flock($f, LOCK_EX); 

लेकिन किसी अन्य प्रक्रिया वर्तमान उपयोगकर्ता से शुरू $f फ़ाइल फ़ाइल संभाल अभी भी चल रहा है स्क्रिप्ट के द्वारा खोला जाता है, भले ही हटा सकते हैं। इस समस्या को हल करने और दूसरों को रोकने के लिए (यानी गैर-PHP प्रक्रियाएं भी) फ़ाइल को हटाने से? और जब प्रक्रिया निकलती है तो लॉक स्वचालित रूप से रिलीज़ हो जाएगा? सभी समान प्रश्न आरटीएम झुंड() के साथ समाप्त होते हैं, लेकिन उनमें से कोई भी बाहरी प्रक्रियाओं के खिलाफ फ़ाइल को लॉक करने का उत्तर नहीं देता है।

ओएस Linux 2.6.32-431.el6.x86_64

+2

'झुंड 'सलाहकार" सख्त नहीं है। अपनी स्क्रिप्ट में फ़ाइल के साथ कुछ भी करने से पहले [अतिरिक्त जांच] (http://stackoverflow.com/questions/20771824/php-test-if-file-is-locked) का उपयोग करें। यह काम करेगा यदि यह आपकी अपनी PHP स्क्रिप्ट के बारे में है। यदि यह बाहरी प्रक्रियाओं के बारे में है - तो 'झुंड' मामले को सहेज नहीं सकता है। –

+1

जैसा कि मैंने अपने प्रश्न में उल्लेख किया है, मुझे बाहरी प्रक्रियाओं से हटने से रोकने के लिए फ़ाइल को लॉक करने की आवश्यकता है (यानी गैर-PHP भी) –

उत्तर

5

लिनक्स पर flock डिफ़ॉल्ट, यह उस फ़ाइल जोड़ तोड़ से किसी भी अन्य प्रक्रियाओं से नहीं रोकता है, जिसका मतलब है द्वारा "सलाहकार ताला" का उपयोग करता है। PHP मैनुअल में नोट देखें।

झुंड() विंडोज पर सलाहकार लॉकिंग के बजाय अनिवार्य लॉकिंग का उपयोग करता है। अनिवार्य लॉकिंग को fcntl() सिस्टम कॉल द्वारा समर्थित सामान्य तंत्र के माध्यम से लिनक्स और सिस्टम वी आधारित ऑपरेटिंग सिस्टम पर भी समर्थित है: यानी, यदि फ़ाइल में प्रश्न में सेटगिड अनुमति बिट सेट है और समूह निष्पादन बिट साफ़ हो गया है। लिनक्स पर, फ़ाइल सिस्टम को इसके लिए काम करने के लिए मंडल विकल्प के साथ भी आरोहित करने की आवश्यकता होगी।

भी देखें https://www.kernel.org/doc/Documentation/filesystems/mandatory-locking.txt

एक फ़ाइल अनिवार्य लॉकिंग के लिए एक उम्मीदवार के रूप में चिह्नित किया गया है उसका फ़ाइल मोड में समूह-आईडी बिट की स्थापना लेकिन समूह-निष्पादित बिट को हटाने के द्वारा। यह अन्यथा अर्थहीन संयोजन है, और सिस्टम वी कार्यान्वयनकर्ताओं द्वारा चुना गया था ताकि मौजूदा उपयोगकर्ता प्रोग्राम तोड़ने के लिए नहीं।

ध्यान दें कि समूह-आईडी बिट आमतौर पर कर्नेल द्वारा स्वचालित रूप से साफ़ किया जाता है जब एक सेटगिड फ़ाइल को लिखा जाता है। यह एक सुरक्षा उपाय है। कर्नेल अनिवार्य लॉक उम्मीदवार के विशेष मामले को पहचानने के लिए संशोधित किया गया है और इस बिट को साफ़ करने से बचना है। इसी प्रकार कर्नेल को सेटग्रिड विशेषाधिकारों के साथ अनिवार्य लॉक उम्मीदवार चलाने के लिए संशोधित नहीं किया गया है।

भी चेतावनी मन:

भी नहीं जड़ एक अनिवार्य ताला ओवरराइड कर सकते हैं, तो भगोड़ा प्रक्रियाओं कहर बरपाने ​​सकता है अगर वे महत्वपूर्ण फ़ाइलें ताला। इसे पढ़ने या लिखने की कोशिश करने से पहले फ़ाइल अनुमतियों (सेटगिड बिट को हटाएं) को बदलने के लिए है।

+1

स्पष्टीकरण के लिए धन्यवाद। लेकिन मेरी समस्या को हल करने के लिए PHP में इसे कैसे लागू किया जाए? –

+0

@AlexanderPravdin https://books.google.de/books आज़माएं?id = mCpnlNYzqOQC और lpg = PA247 और ots = qAWSgskqZ6 और dq = अनिवार्य% 20file% 20locking% 20php और hl = de & pg = PA246 # v = onepage और q = अनिवार्य% 20file% 20locking% 20php और f = false – Gordon

+0

धन्यवाद, लेकिन झुंड() फ़ंक्शन बाहरी प्रक्रियाओं के विरुद्ध फ़ाइल को लॉक नहीं करता है (जैसा कि मैं देख सकता हूं कि इस पुस्तक में क्या समझाया गया है)। लेकिन 24 9 और उससे आगे के पृष्ठ छुपाए गए हैं और पुस्तक खरीदने की आवश्यकता है। –

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