Provided by: manpages-ja-dev_0.5.0.0.20221215+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 ヘッダーでは宣言は
       提供されていないが、  紆余曲折があり、 バージョン 2.23 より前の glibc ではこのシステムコー
       ルに対する ABI が公開されていた。 そのため、このシステムコールを利用するには、 (glibc 2.23
       より前では)  自分のコードの中で手動でインターフェースを宣言すればよかった。  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 プロジェクトのリリース 5.10 の一部である。プロジェクトの
       説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。