2012-10-19 5 views
8

私はCデーモンを作成しています。これは、2つのカーネルモジュールが存在するかどうかによって異なります。プログラムはこれらの(または他の)モジュールを直接使用しません。彼らは存在する必要があるだけです。 したがって、実行時にユーザーに警告するために、これらのモジュールが既にロードされているかどうかをプログラムでチェックしたいと思います。実行時にLinuxカーネルモジュールが存在するかどうかをプログラムで確認してください。

/proc/modulesまたはlsmodの出力を解析する前に、ユーティリティ関数はすでにどこかに存在していますか? のようなものis_module_loaded(const char* name);

私は以前これが尋ねられていると確信しています。 しかし、私はこれを検索するための正しい条件が不足していると思います。

答えて

3

あなたはpopenlsmod | 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

非常に汚れているように見えますが、それは機能し、私はこのような単純な解決策について考えたことはありません。 Cheers – dgraziotin

+1

lsmodが "/ proc/modules"を開き、grepが別のプロセスを含み、パイプ用の追加ファイルが開かれた場合、 "grep module_name/proc/modules"を使用し、代わりに? lsmodが利用できない場合でも、これは動作します。 – Jeremy

12

このような機能はありません。実際には、lsmodののソースコード(lsmod.c)はあなたのソリューションにあなたを導く必要があり、その中に以下の行を持っています

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

あり非推奨query_moduleもあるが、それだけで、これらの日カーネルヘッダ内に存在するように見えます。

+0

私の質問は、両方のそのような機能とどのような機能をコーディングするの存在を求めるに十分な曖昧でした。したがって、私はあなたの答えをアップアップし、@ tozkaの答えを受け入れるつもりです。なぜなら、それは私のために働くからです。説明をありがとう! – dgraziotin

関連する問題