2015-06-12 11 views
5

पर किसी अन्य बाइनरी से फ़ाइल का नाम बदलने से रोकें मैं एक ही निर्देशिका में लिखने वाली कई प्रक्रियाओं के साथ काम कर रहा हूं। मेरे पास एक निर्देशिका है dir1/मैक ओएस

मेरी प्रक्रिया dir1/के अंतर्गत एक फ़ाइल a.txt बनाता है। हालांकि दूसरी प्रक्रिया a-temp1.txt बनाता है और इसे a.txt पर पुनर्नामित करता है। मेरे पास दूसरी प्रक्रिया पर नियंत्रण नहीं है क्योंकि वह कोड लाइब्रेरी से आता है। क्या मैं एक temp.txt का नाम बदलने से रोक सकता हूं?

+0

प्रक्रियाएं अलग-अलग उपयोगकर्ताओं के रूप में चलती हैं?आपकी सबसे अच्छी शर्त उन्हें अलग-अलग उपयोगकर्ताओं के रूप में चलाने के लिए हो सकती है, और अन्य उपयोगकर्ता को ओवरराइट करने से रोकने के लिए फ़ाइल अनुमतियों का उपयोग करें। यह वास्तविक मुद्दे के लिए स्पर्शपूर्ण हो सकता है, हालांकि मुझे नहीं लगता कि यहां मदद करने के लिए पर्याप्त जानकारी है। – KirkSpaziani

+0

नहीं, प्रक्रियाएं एक ही उपयोगकर्ता के रूप में चलती हैं। और मैं इसे बदल नहीं सकता। – shreyasva

+0

मुझे विश्वास करने में बहुत मुश्किल समय है कि इस तरह की समस्या को सुलझाने के लिए उपयोग करने योग्य प्रणाली बाहर आने वाली है। –

उत्तर

0

आप कर सकते हैं, लेकिन यह आपकी समस्या का समाधान नहीं करेगा। मुझे दृढ़ता से संदेह है कि यह X-Y problem है, और लगभग निश्चित रूप से सही समाधान इस प्रणाली के कुछ हिस्सों को पूरी तरह से फिर से डिजाइन करना है, संभवतया आपके फ़ाइल नामों को बदलकर, अनोखी अस्थायी फ़ाइलों का उपयोग करके, किसी अन्य निर्देशिका में जाकर, या लाइब्रेरी के उपयोग को पुन: उपयोग करना (पुस्तकालय केवल वही करें जो कॉलर उन्हें करने के लिए कहते हैं; और पुस्तकालय वैसे भी कोड हैं)। आपको दूसरी प्रक्रिया को हराने की कोशिश नहीं करनी चाहिए; आप सभी एक ही उपयोगकर्ता के लिए काम कर रहे हैं।

यह सब कुछ कहा, निश्चित रूप से, आप अपने यूजर आईडी को फाइल पर नाम बदलने से रोक सकते हैं। बस खुद को अनुमति नकारें।

chmod 400 a.txt 

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

इसी तरह, आप निर्देशिका पर अनुमतियों को बदल सकते हैं :

chmod 500 . 

यह नाम बदलने को रोकने क्योंकि फ़ाइल नाम निर्देशिका में रखा जाता है जाएगा।

+0

नहीं। 'Chmod 400' काम नहीं करता है। बस कोशिश की। 'नाम बदलें()' खुशी से फाइल को गहराई से गहरा कर देगा और इसे दूसरे के साथ बदल देगा। –

+0

दिलचस्प; 'एमवी 'नहीं होगा; यह एक और स्तर पर जांच करनी चाहिए। धन्यवाद। संपादित। –

+0

500 सृजन के बाद भी काम नहीं करेगा (जो निर्देशिका पर एक लिखने का ऑपरेशन है) काम नहीं करेगा। काश मैं इस प्रणाली को फिर से डिजाइन/पुन: कार्य कर सकता हूं लेकिन दुर्भाग्य से मैं नहीं कर सकता। – shreyasva

0

UF_APPEND विशेषता सेट करने के लिए आप एचएफएस + (मैक ओएस एक्स) फ़ाइल सिस्टम पर chflags() का उपयोग कर सकते हैं। (man 2 chflags करें।) वह उसी उपयोगकर्ता द्वारा फ़ाइल में शामिल होने की अनुमति देगा, लेकिन हटाए या नामकरण नहीं करेगा।

0

ऐसा कुछ भी नहीं है जो आप कर सकते हैं कि अन्य प्रक्रिया पूर्ववत नहीं हो सकती है। आपकी सबसे अच्छी उम्मीद (आपके प्रोग्राम को सैनिली रूप से काम करने के अलावा बदलने के अलावा) यह है कि दूसरी प्रक्रिया नाम बदलने के लिए बहुत मेहनत नहीं करती है। यही है, यह सरल दृष्टिकोण की कोशिश करता है और अगर वह विफल रहता है तो छोड़ देता है।

विशेष रूप से, आप किसी भी फ़ाइल पर UF_IMMUTABLE ध्वज सेट कर सकते हैं और इससे दूसरे को बदलने के लिए नाम बदल दिया जा सकता है। आप chflags() का उपयोग करके ध्वज सेट कर सकते हैं। कोको का उपयोग करके, आप [someURL setResourceValue:@YES forKey:NSURLIsUserImmutableKey error:NULL] का भी उपयोग कर सकते हैं।

, ध्यान रखें कि आप किसी अन्य तरीके से फ़ाइल को बदलने के लिए, या तो नहीं कर सकेंगे रखें जब तक कि झंडा हटा दिया है। अन्य प्रक्रिया फ़ाइल का नाम बदलने के लिए निर्धारित किया जाता है, यह झंडा अपनी प्रक्रिया की तरह ही होता है को निकालने की अनुमति नहीं है।

यह भी ध्यान रखें कि इस तरह की एक प्रणाली निहित रूप से दौड़-प्रवण है।

आप वास्तव में चाहिए फ़ाइलें, या अलग निर्देशिका के लिए अलग नामों का उपयोग करें, या कि पुस्तकालय है कि आप नियंत्रण की जरूरत नहीं देता खाई करने के लिए।

+0

मुझे लगता है कि यह एक कदम आगे है। लेकिन मैं अभी भी निर्देशिका में रहने के लिए a-temp.txt पसंद करूंगा। अगर नाम विफल हुआ तो दूसरी प्रक्रिया इसे हटा देती है। उस फ़ाइल को हटाने से रोकने के लिए कोई तरीका? कृपया ध्यान दें कि जब फ़ाइल बनाई जाती है तो मेरे पास नियंत्रण नहीं होता है। मैं मानता हूं कि पुस्तकालय स्वाभाविक रूप से दौड़-प्रवण है। दुर्भाग्यवश मैं इसमें बदलाव नहीं कर सकता और मैं दौड़ की स्थिति को हल करने के लिए इसके आसपास काम करने की कोशिश कर रहा हूं। – shreyasva

0

उपयोगकर्ता अपरिवर्तनीय ध्वज chflags(...,uchg सेट करें)। यह दूसरी प्रक्रिया को आपकी फ़ाइल को तब तक बदलने से रोक देगा जब तक कि बिट को साफ़ करने में कोई कार्रवाई न हो। निस्संदेह मुझे नहीं पता कि दूसरी प्रक्रिया आपके लिए चीजों को किस तरह से डालने पर प्रतिक्रिया करेगी, लेकिन यह सवाल नहीं था।