2010-07-13 15 views
10

क्या यह कोई पोर्टेबल तरीका है (POSIX सिस्टम पर) यह निर्धारित करने के लिए कि फ़ाइल डिस्क्रिप्टर खोजने योग्य है या नहीं? मेरा विचार lseek(fd, 0, SEEK_CUR); का उपयोग करना है और जांच करें कि वापसी मूल्य -1 है, लेकिन मुझे अनिश्चितता है अगर यह झूठी नकारात्मक या झूठी सकारात्मक दे सकती है। fstat का उपयोग करके और इस बारे में धारणाएं बनाना कि किस प्रकार की फाइलें खोजने योग्य/अनुपयोगी हैं, यह एक अच्छा विचार नहीं है। कोई अन्य विचार?यह निर्धारित करने के लिए कि कोई फ़ाइल डिस्क्रिप्टर खोजने योग्य है या नहीं?

उत्तर

10

lseek विधि उचित लगता है। यह निश्चित रूप से झूठी नकारात्मक नहीं हो सकता है - अगर ऐसा होता है, तो कार्यान्वयन के साथ कुछ गंभीरता से गलत है। इसके अलावा, POSIX spec के अनुसार, यह डिस्क्रिप्टर एक पाइप, फीफो या सॉकेट है, तो सैद्धांतिक रूप से आपके पास झूठी सकारात्मक नहीं होना चाहिए। एकमात्र शेष प्रश्न यह है कि चश्मा का पालन करने वाले विभिन्न सिस्टम कितनी अच्छी तरह से हैं। हालांकि, यह किसी भी अन्य तरीकों की तरह लगता है, जो कुछ भी हो सकता है, निश्चित रूप से इससे कम पोर्टेबल होगा।

2

आप fstat() का उपयोग कर सकते हैं, फिर स्टेट स्ट्रक्चर के मोड फ़ील्ड पर S_ISREG मैक्रो का उपयोग यह जांचने के लिए कर सकता है कि यह एक नियमित फ़ाइल है या नहीं; एक नियमित फ़ाइल, per definiton, तलाश योग्य है जबकि एक "गैर-नियमित" (विशेष) फ़ाइल नहीं हो सकती है (मुझे नहीं पता कि क्या विशेष फाइलें भी तलाश योग्य हैं)।

लेकिन हाँ, lseek() और errno == ईएसपीआईपीई के वापसी मूल्य की जांच करना भी काम करना चाहिए। सिद्धांत रूप में, the effect of lseek() on devices which are incapable of seeking is implementation-defined, इसलिए नाक संबंधी डिमन्स से सावधान रहें।

+3

हार्ड ड्राइव जैसे ब्लॉक डिवाइस, खोजने योग्य हो सकते हैं। शायद चरित्र उपकरण भी, लेकिन मुझे यकीन नहीं है। – Thomas

+1

कुछ डिवाइस जो वास्तव में खोजे जाने योग्य नहीं हैं, वे खोज में असफल नहीं होंगे (लिनक्स पर लीस पर, किसी ने खोज को विफल करने की कोशिश की लेकिन व्यवहार पर निर्भर उपयोगकर्ताओं के ऐप्स की खोज की ...) – Spudd86

+0

सच; कुछ चरित्र डिवाइस ड्राइवर केवल तलाश() और चुपचाप वापस अनदेखा करते हैं। –

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

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