DELETE_MODULE(2)

名前
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
        flags に O_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 関数がなく、 flags に O_TRUNC が指定されていなかった。

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

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

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

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

準拠
delete_module() は Linux 固有である。

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

flags に O_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/ に書かれている。