DELETE_MODULE - Linux手册页

时间:2019-08-20 17:58:37  来源:igfitidea点击:

Linux程序员手册 第2部分
更新日期: 2017-09-15

名称

delete_module-卸载内核模块

语法

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

注意:glibc标头中未提供此系统调用的声明;请参阅注释。

说明

系统调用delete_module()尝试删除由名称标识的未使用的可加载模块条目。如果模块具有退出功能,则在卸载模块之前执行该功能。 flags参数用于修改系统调用的行为,如下所述。此系统调用需要特权。

根据以下规则尝试删除模块:

1.
如果还有其他加载的模块依赖于此模块(例如,参考其中定义的符号),则调用将失败。
2.
否则,如果模块的引用计数(即当前正在使用该模块的进程数)为零,则将立即卸载该模块。
3.
如果模块的参考计数非零,则行为取决于标志中设置的位。在正常使用情况下(请参见"注释"),始终指定O_NONBLOCK标志,并且可以另外指定O_TRUNC标志。
The various combinations for flags

have the following effect:

flags == O_NONBLOCK
呼叫立即返回,并显示错误。
flags == (O_NONBLOCK | O_TRUNC)
无论模块是否具有非零引用计数,都将立即将其卸载。
(flags & O_NONBLOCK) == 0
If flags

does not specify
O_NONBLOCK,

the following steps occur:

*
该模块已标记,因此不允许新的引用。
*
如果模块的参考计数不为零,则调用者将处于不间断的睡眠状态(TASK_UNINTERRUPTIBLE),直到参考计数为零为止,此时调用将解除阻塞。
*
该模块以通常的方式卸载。

O_TRUNC标志对上述规则有进一步的影响。默认情况下,如果模块具有初始化功能但没有退出功能,则尝试删除该模块将失败。但是,如果指定了O_TRUNC,则将忽略此要求。

使用O_TRUNC标志很危险!如果内核不是使用CONFIG_MODULE_FORCE_UNLOAD构建的,则将忽略此标志。 (通常,启用CONFIG_MODULE_FORCE_UNLOAD。)使用此标志会污染内核(TAINT_FORCED_RMMOD)。

返回值

成功时,返回零。错误时,返回-1并正确设置errno。

错误说明

EBUSY
该模块不是"活动"的(即,它仍在初始化中或已经标记为要移除);或者,该模块具有初始化功能,但没有退出功能,并且未在标志中指定O_TRUNC。
EFAULT
名称是指进程的可访问地址空间之外的位置。
ENOENT
没有使用该名称的模块。
EPERM
调用方没有特权(没有CAP_SYS_MODULE功能),或者模块卸载被禁用(请参见proc(5)中的/ proc / sys / kernel / modules_disabled)。
EWOULDBLOCK
其他模块取决于此模块。或者,在标志中指定了O_NONBLOCK,但是此模块的引用计数为非零,并且在标志中未指定O_TRUNC。

遵循规范

delete_module()是特定于Linux的。

备注

glibc不支持delete_module()系统调用。 glibc标头中未提供任何声明,但是经过一段古怪的历史,2.23之前的glibc版本确实为此系统调用导出了ABI。因此,为了使用此系统调用,在glibc 2.23之前,在代码中手动声明接口就足够了;或者,您可以使用syscall(2)调用系统调用。

如果从标志中省略O_NONBLOCK,则可能发生的不间断睡眠被认为是不希望的,因为睡眠过程处于不可杀死的状态。与Linux 3.7一样,指定O_NONBLOCK是可选的,但是在将来的内核中,它可能成为强制性的。

Linux 2.4 and earlier

在Linux 2.4和更早版本中,系统调用仅采用一个参数:

int delete_module(const char * name);

如果名称为NULL,则将所有未标记为自动清除的模块删除。

当前在本手册页中没有解释Linux 2.4和更早版本中delete_module()的行为差异的其他详细信息。

另外参见

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

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/