delete_module - Décharger un module de noyau
Bibliothèque C standard (
libc,
-lc)
#include <fcntl.h> /* Definition of O_* constants */
#include <sys/syscall.h> /* Definition of SYS_* constants */
#include <unistd.h>
int syscall(SYS_delete_module, const char *name, unsigned int flags);
Note : la glibe ne fournit pas d'enveloppe autour de
delete_module(), nécessitant l'utilisation de
syscall(2).
L'appel système
delete_module() essaye de supprimer une
entrée de module chargeable inutilisée identifiée par
name. Si le module à une fonction
exit, alors cette
fonction est exécutée avant de décharger le module.
L'argument
flags est utilisé pour modifier le comportement de
l'appel système, conformément à la description
ci-dessous. Cet appel système nécessite des droits.
La suppression de module est tentée d'après les règles
suivantes.
- (1)
- Si d'autres modules chargés dépendent de
(c'est-à-dire font référence aux symboles
définis dans) ce module, alors l'appel échoue.
- (2)
- Sinon, si le nombre de références pour ce
module (c'est-à-dire le nombre de processus utilisant actuellement
ce module) est nul, alors le module est immédiatement
déchargé.
- (3)
- Si un module a un nombre de références non
nul, alors le comportement dépend des bits définis dans
flags. En utilisation normale (consultez NOTES), l'attribut
O_NONBLOCK est toujours indiqué, et l'attribut
O_TRUNC pourrait être aussi indiqué.
- Les diverses combinaisons de flags ont les effets
suivants.
- flags == O_NONBLOCK
- L'appel se termine immédiatement, avec une
erreur.
- flags == (O_NONBLOCK | O_TRUNC)
- Le module est déchargé immédiatement,
quelque soit le nombre de références.
- (flags & O_NONBLOCK) == 0
- Si flags n'indique pas O_NONBLOCK, les
étapes suivantes se succèdent :
- •
- le module est marqué de telle sorte qu'aucune
nouvelle référence n'est permise ;
- •
- si le nombre de références du module est non
nul, l'appelant est placé en état de sommeil non
interruptible ( TASK_UNINTERRUPTIBLE) jusqu'à ce que le
nombre de références soit nul, à ce moment l'appel
est débloqué ;
- •
- le module est déchargé normalement
L'attribut
O_TRUNC a un effet supplémentaire sur les règles
décrites précédemment. Par défaut, si un module a
une fonction
init mais pas de fonction
exit, essayer de
supprimer ce module échouera. Cependant, si
O_TRUNC a
été indiqué, cette condition est contournée.
Utiliser l'attribut
O_TRUNC est dangereux. Si le noyau n'a pas
été construit avec
CONFIG_MODULE_FORCE_UNLOAD, cet
attribut est ignoré silencieusement (normalement,
CONFIG_MODULE_FORCE_UNLOAD est activé). Utiliser cet attribut
corrompt le noyau (TAINT_FORCED_RMMOD).
En cas de succès,
0 est renvoyé. en cas d'échec,
-1 est renvoyé et
errno se positionné pour
indiquer l'erreur.
- EBUSY
- Le module n'est pas « actif »
(c'est-à-dire qu'il est encore en cours d'initialisation ou
déjà marqué pour la suppression), ou le module a une
fonction init mais pas de fonction exit, et O_TRUNC
n'a pas été indiqué dans flags.
- EFAULT
-
name fait référence à un
emplacement en dehors de l'espace d'adressage accessible du
processus.
- ENOENT
- Il n'existe aucun module de ce nom.
- EPERM
- L'appelant n'avait pas les droits (n'avait pas la
capacité CAP_SYS_MODULE), ou le déchargement de
module est désactivé (consultez
/proc/sys/kernel/modules_disabled dans proc(5)).
- EWOULDBLOCK
- D'autres modules dépendent de ce module, ou
O_NONBLOCK a été indiqué dans flags,
mais le nombre de références est non nul et O_TRUNC
n'a pas été indiqué dans flags.
delete_module() est spécifique à Linux.
L'appel système
delete_module() n'est pas pris en charge par la
glibc. Il n'est pas déclaré dans les en-têtes de la glibc
mais, par un caprice de l'histoire, les versions de la glibc
antérieures à la glibc 2.23 fournissaient une interface
binaire pour cet appel système. Ainsi, il suffisait, avant la
glibc 2.23, de déclarer manuellement l'interface dans votre code
pour utiliser cet appel système. Sinon, vous pouvez l'invoquer en
utilisant
syscall(2).
Le sommeil non interruptible qui peut arriver si
O_NONBLOCK est omis de
flags est considéré indésirable, parce que le
processus dormant est laissé dans un état non tuable. Avec
Linux 3.7, indiquer
O_NONBLOCK est facultatif, mais à
l'avenir, ce sera probablement obligatoire.
Dans Linux 2.4 et antérieurs, l'appel système ne prend
qu'un argument :
int delete_module(const char *name);
Si
name est NULL, tous les modules non utilisés marqués
à nettoyer automatiquement sont supprimés.
De plus amples précisions sur les différences de comportement de
delete_module() dans Linux 2.4 et antérieurs ne sont
pas actuellement expliquées dans cette page de manuel.
create_module(2),
init_module(2),
query_module(2),
lsmod(8),
modprobe(8),
rmmod(8)
La traduction française de cette page de manuel a été
créée par Christophe Blaess
<
https://www.blaess.fr/christophe/>, Stéphan Rafin
<
[email protected]>, Thierry Vignaud
<
[email protected]>, François Micaux, Alain Portal
<
[email protected]>, Jean-Philippe Guérard
<
[email protected]>, Jean-Luc Coulon (f5ibh)
<
[email protected]>, Julien Cristau
<
[email protected]>, Thomas Huriaux <
[email protected]>,
Nicolas François <
[email protected]>, Florentin
Duneau <
[email protected]>, Simon Paillard
<
[email protected]>, Denis Barbier
<
[email protected]> et David Prévot <
[email protected]>
Cette traduction est une documentation libre ; veuillez vous reporter
à la
GNU
General Public License version 3 concernant les conditions de copie
et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message à
[email protected]