bionic (2) delete_module.2.gz

Provided by: manpages-ja-dev_0.5.0.0.20161015+dfsg-1_all bug

名前

       delete_module - カーネルモジュールをアンロードする

書式

       int delete_module(const char *name, int flags);

       注意: この関数の宣言は glibc のヘッダーでは提供されていない。「注意」を参照。

説明

       delete_module()  システムコールは、 name で特定される未使用のロード可能なモジュールのエントリーを削除しよ
       うとする。 モジュールに exit 関数がある場合、 モジュールをアンロードする前にこの関数が実行される。  flags
       引き数は、以下で説明するようにシステムコールの動作を変更するのに使用される。 このシステムコールには特権が
       必要である。

       モジュールの削除は以下のルールにしたがって行われる。

       1.  このモジュールに依存している (このモジュールで定義されているシンボルを参照している)  モジュールがロー
           ドされている場合、 この呼び出しは失敗する。

       2.  それ以外の場合で、  モジュールの参照カウント (このモジュールを現在使用しているプロセス数) が 0 であれ
           ば、 モジュールは直ちにアンロードされる。

       3.  モジュールの参照カウントが 0 でない場合、 その動作は flags にセットされたビットによって決まる。  通常
           の使用時は (「注意」参照)、 O_NONBLOCK は常に指定され、 O_TRUNC フラグが追加で指定されることがある。

           flags の組み合わせが持つ効果は以下のとおりである。

           flags == O_NONBLOCK
                  エラーの場合、 呼び出しは直ちに返る。

           flags == (O_NONBLOCK | O_TRUNC)
                  参照カウントが 0 以外かどうかに関わらず、 直ちにモジュールをアンロードする。

           (flags & O_NONBLOCK) == 0
                  flagsO_NONBLOCK が指定されなかった場合、 以下のステップで処理が行われる。

                  *  新しい参照を許可しないように、 指定されたモジュールにマークを付ける。

                  *  モジュールの参照カウントが  0 でない場合、 参照カウントが 0 になるまで、 呼び出し元は割り込
                     み不可のスリープ状態 (TASK_UNINTERRUPTIBLE) に置かれる。 参照カウントが 0  になった時点で、
                     呼び出し元の停止が解除される。

                  *  モジュールは通常通りの方法でアンロードされる。

       O_TRUNC  フラグには上記のルールに加えてもう一つの効果がある。 デフォルトでは、 モジュールに init 関数があ
       るが exit 関数がない場合、 そのモジュールを削除しようとすると失敗する。 しかし、  O_TRUNC  が指定された場
       合、 この要件はスキップされる。

       O_TRUNC フラグの使用は危険である! カーネルが CONFIG_MODULE_FORCE_UNLOAD で作成されていない場合、 このフラ
       グは黙って無視される (通常は CONFIG_MODULE_FORCE_UNLOAD は有効になっている)。  このフラグを使うとカーネル
       にゴミが残ることになる (TAINT_FORCED_RMMOD)。

返り値

       成功の場合 0 が返される。エラーの場合 -1 が返され、 errno に適切な値が設定される。

エラー

       EBUSY  モジュールは"live" ではない (モジュールがまだ初期化中か、 すでに削除のマークが付けられている)。 モ
              ジュールに init 関数があるが exit 関数がなく、 flagsO_TRUNC が指定されていなかった。

       EFAULT name がプロセスがアクセスできるアドレス空間外の場所を参照している。

       ENOENT その名前のモジュールが存在しない。

       EPERM  呼び出し元が特権 (CAP_SYS_MODULE ケーパビリティ)  を持っていなかった。  または、  モジュールのアン
              ロードが無効になっている (proc(5) の /proc/sys/kernel/modules_disabled を参照)。

       EWOULDBLOCK
              他のモジュールがこのモジュールに依存している。または、 flagsO_NONBLOCK が指定されたが、 このモ
              ジュールの参照カウントが 0 以外で flagsO_TRUNC が指定されていなかった。

準拠

       delete_module()  は Linux 固有である。

注意

       delete_module() システムコールは glibc ではサポートされていない。 glibc  ヘッダーでは宣言は提供されていな
       いが、  歴史の紆余曲折を経て glibc はこのシステムコールに対する ABI を公開していない。 したがって、このシ
       ステムコールを利用するには、自分のコードの中で手動でインターフェースを宣言すればよい。 syscall(2)  を使っ
       てシステムコールを起動できる。

       flagsO_NONBLOCK が指定されていない場合に起こる可能性がある割り込み不可のスリープは望ましくないと考え
       られている。 なぜなら、 スリープしているプロセスは kill できない状態 (unkillable state)  のままになるから
       である。 Linux 3.7 時点では、 O_NONBLOCK の指定は省略可能だが、 将来のカーネルでは必須になるだろう。

   Linux 2.4 以前
       Linux 2.4 以前では、 このシステムコールの引き数は 1 つだけであった。

        int delete_module(const char *name);

       name が NULL の場合、 auto-clean のマークがついたすべての未使用のモジュールが削除される。

       Linux  2.4 以前の delete_module() の動作のより詳細な違いは、 現在のところこのマニュアルページでは説明しな
       

関連項目

       create_module(2), init_module(2), query_module(2), lsmod(8), modprobe(8), rmmod(8)

この文書について

       この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告
       に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。