2011-10-02 14 views
6

द्वारा डिवाइस ध्वज प्राप्त करें आशा है कि आप मेरी मदद कर सकते हैं: मैं यह निर्धारित करने की कोशिश कर रहा हूं कि डिवाइस हटाने योग्य है या नहीं, मेरे पास डिवाइस का नाम (/ dev/sdc) है। असल में, मुझे यह निर्धारित करने की आवश्यकता है कि फ़ाइल को हटाने योग्य मीडिया या स्थानीय डिस्क पर फ़ाइल इस फ़ाइल के पूर्ण पथ से कब होगी।डिवाइस नाम

मैं current-> FS-> pwd में खोज करने के लिए tryed है और सब मैं मिल सकता है झंडे का एक सेट यहाँ है: * current-> FS-> pwd.mnt-> mnt_sb- > s_bdev-> bd_disk-> झंडे * जहां हटाने योग्य उपकरणों

लेकिन मैं हमेशा एक ही झंडे सेट (के रूप में मैं समझता हूँ, s_bdev हमेशा एक ही डिवाइस (/ dev/sda) को इंगित करता है) के लिए GENHD_FL_REMOVABLE सेट।

तो अब मुझे डिवाइस का नाम (/ dev/sdc) मिलता है जिसमें mtab को पार्स करके मेरी फ़ाइल होती है, लेकिन अभी भी यह पता नहीं लगाया जा सकता है, इसे हटाया जा सकता है या नहीं।

क्या डिवाइस नाम से block_device संरचना प्राप्त करने का कोई संभावित तरीका है? (उदाहरण के लिए, "फाइल" संरचना बुला fd = खुला ("नाम") fl = fged (FD) द्वारा प्राप्त किया जा सकता है, जहां fl अंक "फाइल" संरचना करने के लिए)

उत्तर

1

आप class_dev_iter_init और class_dev_iter_next का उपयोग करके ब्लॉक डिवाइस पर पुनरावृत्त कर सकते हैं। उपयोग के लिए block/genhd.cblk_lookup_devt में कोड देखें।

एक बार आपके पास डिवाइस होने के बाद, आप का उपयोग struct gendisk * प्राप्त करने के लिए कर सकते हैं, जिसमें आप हटाने योग्य ध्वज की जांच कर सकते हैं।

+0

धन्यवाद, ऐसा लगता है कि यह मेरी समस्या हल करता है – Makc

+0

तो, इस तरह से, मैं यह निर्धारित कर सकता हूं कि ब्लॉक फ़ाइल में से कौन सा ब्लॉक मेरी खुली फ़ाइल में है यदि मेरे पास इस फ़ाइल का केवल पूरा पथ है। – Makc

+1

@Makc: मुझे लगता है कि आप 'vfs_stat' का उपयोग कर सकते हैं, यह आपको' struct kstat' देगा जिसमें आप 'dev_t' को ब्लॉक डिवाइस से तुलना करने में सक्षम होंगे। – Hasturkun

1

पढ़ें/sys/ब्लॉक/dev-name/हटाने योग्य है क्योंकि इसमें 1 होना चाहिए यदि डिवाइस हटाने योग्य है या 0 नहीं है। (dev-name = डिवाइस का नाम: sda, hda, fd0, ...)

+0

मुझे इसके बारे में पता है, लेकिन यह पुराने लिनक्स संस्करणों के तहत काम नहीं कर रहा है, वैसे भी, धन्यवाद। – Makc

+0

इसके अलावा, मुझे कर्नेल मॉड्यूल से फ़ाइलों को पढ़ने के लिए कोई सुरक्षित तरीका नहीं पता है। (मैंने sys_read() और vfs_read() का प्रयास किया है - यह "ओप्स" का कारण बनता है :)) शायद आप कर्नेल मॉड्यूल से sysfs acces करने के किसी भी तरीके से जानते हैं? – Makc