2012-10-19 18 views
8

पर मौजूद है या नहीं, मैं एक सी डिमन लिख रहा हूं, जो कि नौकरी करने के लिए दो कर्नेल मॉड्यूल के अस्तित्व पर निर्भर करता है। कार्यक्रम सीधे इन (या किसी अन्य) मॉड्यूल का उपयोग नहीं करता है। यह केवल उन्हें अस्तित्व में रहने की जरूरत है। इसलिए, मैं रनटाइम पर उपयोगकर्ता को चेतावनी देने के लिए प्रोग्रामेटिक रूप से जांचना चाहता हूं कि ये मॉड्यूल पहले ही लोड हो चुके हैं या नहीं।प्रोग्रामेटिक रूप से जांचें कि क्या लिनक्स कर्नेल मॉड्यूल रनटाइम

इससे पहले कि मैं /proc/modules या lsmod आउटपुट पार्सिंग जैसी चीजें करना शुरू कर दूं, क्या कोई उपयोगिता फ़ंक्शन पहले से मौजूद है? कुछ is_module_loaded(const char* name) की तरह;

मुझे पूरा यकीन है कि इससे पहले पूछा गया है। हालांकि, मुझे लगता है कि मुझे इसकी खोज करने के लिए सही शब्द याद आ रही हैं।

उत्तर

3

आप उपयोग कर सकते हैं popen और lsmod | grep चाल:

FILE *fd = popen("lsmod | grep module_name", "r"); 

    char buf[16]; 
    if (fread (buf, 1, sizeof (buf), fd) > 0) // if there is some result the module must be loaded 
    printf ("module is loaded\n"); 
    else 
    printf ("module is not loaded\n"); 
+0

बहुत गंदा लग रहा है लेकिन यह काम करता है और मैंने कभी इस तरह के सरल समाधान के बारे में सोचा नहीं है। चीयर्स – dgraziotin

+1

यह देखते हुए कि lsmod "/ proc/modules" खुलता है, और उस grep में एक और प्रक्रिया शामिल है और पाइप के लिए अतिरिक्त फ़ाइल खुलती है, क्या यह "grep module_name/proc/मॉड्यूल" का उपयोग करने के लिए अधिक कुशल होगा और जांच करें कि कोई आउटपुट है या नहीं इसके बजाए? यह भी काम करेगा भले ही lsmod उपलब्ध नहीं था। – Jeremy

12

ऐसा कोई फ़ंक्शन नहीं है। वास्तव में, lsmod के स्रोत कोड (lsmod.c) उस में निम्न पंक्ति जो आप अपने समाधान के लिए नेतृत्व चाहिए:

file = fopen("/proc/modules", "r"); 

भी एक पदावनत query_module नहीं है लेकिन यह केवल इन दिनों कर्नेल हेडर में मौजूद नहीं है।

+0

मेरा प्रश्न दोनों तरह के समारोह और कैसे कार्यक्षमता कोड करने के अस्तित्व के लिए कह देना काफी अस्पष्ट था। इसलिए, मैं आपके उत्तर को ऊपर उठाने और @tozka उत्तर स्वीकार करने जा रहा हूं, क्योंकि यह मेरे लिए काम करता है। स्पष्टीकरण के लिए धन्यवाद! – dgraziotin

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