2011-02-04 13 views
5

यदि मेरे पास लिनक्स या मैक ओएस एक्स जैसे पॉज़िक्स सिस्टम हैं, तो यह निर्धारित करने के लिए सबसे अच्छा और सबसे पोर्टेबल तरीका क्या है कि कोई पथ केवल-पढ़ने वाली फाइल सिस्टम पर है या नहीं? मैं अपने सिर के ऊपर से 4 तरीके के बारे में सोच सकते हैं:यह निर्धारित करने के लिए सबसे अच्छा पॉज़िक्स तरीका है कि कोई फ़ाइल सिस्टम माउंट किया गया है केवल

  • open(2) एक फ़ाइल O_WRONLY साथ - आप एक अद्वितीय फ़ाइल नाम के साथ आने के लिए और भी O_CREAT और O_EXCL में पास की आवश्यकता होगी। यदि यह विफल रहता है और आपके पास EROFS का इरनो है तो आप जानते हैं कि यह केवल पढ़ने-योग्य फाइल सिस्टम है। वास्तव में उस फाइल को बनाने का कष्टप्रद दुष्प्रभाव होगा जिसकी आपको परवाह नहीं है, लेकिन आप इसे बनाने के तुरंत बाद unlink(2) कर सकते हैं।

  • statvfs(3) - लौटे struct statvfs के क्षेत्रों में से एक f_flag है, और झंडे में से एक केवल पढ़ने के लिए फाइल सिस्टम के लिए ST_RDONLY है। हालांकि, statvfs(3) के लिए spec यह स्पष्ट करता है कि अनुप्रयोग मान्य जानकारी वाले किसी भी फ़ील्ड पर निर्भर नहीं हो सकते हैं। ऐसा लगता है कि ST_RDONLY एक सभ्य संभावना है जो केवल पढ़ने-योग्य फाइल सिस्टम के लिए सेट नहीं हो सकता है।

  • access(2) - आप माउंट बिंदु जानते हैं, तो आप के रूप में लंबे W_OK ध्वज के साथ access(2) उपयोग कर सकते हैं के रूप में आप किसी ऐसे उपयोगकर्ता को माउंटप्वाइंट में लिखने के रूप में चल रहे हैं। हां, या तो आप रूट हैं या इसे आपके यूआईडी के साथ माउंट पैरामीटर के रूप में रखा गया था। आपको -1 का रिटर्न वैल्यू मिलेगा और EROFS की इरनो मिलेगी।

  • पार्सिंग /etc/mtab या /proc/mounts - पोर्टेबल प्रतीत नहीं होता है। ऐसा लगता है कि मैक ओएस एक्स में इनमें से कोई भी नहीं है। यहां तक ​​कि अगर सिस्टम में /etc/mtab है, तो मुझे यकीन नहीं है कि फ़ील्ड ओएस के बीच सुसंगत हैं या यदि केवल पढ़ने के लिए माउंट विकल्प (लिनक्स पर ro) पोर्टेबल हैं।

क्या अन्य तरीके हैं जो मुझे याद आ रही है? अगर आपको यह जानने की ज़रूरत है कि फाइल सिस्टम केवल पढ़ने के लिए माउंट किया गया था, तो आप इसे कैसे करेंगे?

+1

mtab पर, अगर एक फ़ाइल सिस्टम rw घुड़सवार है लेकिन बाद में ro जाता है, mtab अद्यतन नहीं होगा।/proc/माउंट सही ढंग से अपडेट हो जाएगा। – Ryaner

उत्तर

1

आप popen कमांड mount पर भी देख सकते हैं और अपने फ़ाइल सिस्टम की तलाश में आउटपुट की जांच कर सकते हैं और देख सकते हैं कि यह " (ro," टेक्स्ट है या नहीं।

लेकिन फिर, यह आवश्यक पोर्टेबल नहीं है।

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

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

+0

सामान्य स्थिति में बस दौड़ की स्थिति के कारण लिखने के साथ सहमत हैं; यही कारण है कि पहुंच (2) आम तौर पर निराश होती है। लेकिन मेरे विशिष्ट मामले में मुझे पूरी तरह से आधारित नीति निर्णय लेने की आवश्यकता है कि एफएस स्वयं ही पढ़ा गया था या नहीं; मुझे वास्तव में एफएस को फाइल लिखने की परवाह नहीं है। –

+0

'' '' '' '' '' '' '' '' '' '' '' '' '' '' '/'/mtab''' जो कि ro फाइल सिस्टम पर है, तो यह गलत हो सकता है। – Willem

2
utime(path, NULL); 

आप लिखने perms है, तो यह है कि आप ROFS दे देंगे या - यदि अनुमति हो - बस निर्देशिका, जो मूल रूप से हानिरहित है पर mtime अद्यतन करें।

+1

मूल रूप से हानिरहित, शायद कहने के लिए, ... वृद्धिशील बैकअप प्रोग्राम? :-) – paxdiablo

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

  • कोई संबंधित समस्या नहीं^_^