delete_module(2) System Calls Manual delete_module(2) NAZWA delete_module - usuwa (odlacza) modul jadra BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include /* Definicja stalych O_* */ #include /* Definicja stalych SYS_* */ #include int syscall(SYS_delete_module, const char *name, unsigned int flags); Uwaga: glibc nie udostepnia opakowania dla delete_module(), co wymusza uzycie syscall(2). OPIS Wywolanie systemowe delete_module() probuje usunac nieuzywany, ladowalny wpis modulu okreslony nazwa name. Jesli modul posiada funkcje exit, to jest ona wykonywana przed usunieciem modulu. Argument flags sluzy do modyfikacji zachowania wywolania systemowego, zgodnie z opisem ponizej. To wywolanie systemowe wymaga uprzywilejowania. Proba usuniecia modulu zachodzi zgodnie z ponizszymi regulami: (1) Jesli wystepuja inne zaladowane moduly zalezace od tego modulu (tzn. odniesienia do symboli w nim zdefiniowanych), to wywolanie zawodzi. (2) W przeciwnym razie, jesli licznik odniesien do modulu (tzn. liczba procesow uzywajacych go aktualnie) wynosi zero, to modul jest natychmiast usuwany. (3) Jesli modul ma niezerowy licznik odniesien, to zachowanie zalezy od bitow ustawionych w flags. Przy zwyklym uzyciu (zob. UWAGI), podany jest zawsze znacznik O_NONBLOCK, dodatkowo mozna tez podac znacznik O_TRUNC. Rozne zestawienia flags daja nastepujacy rezultat: flags == O_NONBLOCK Wywolanie natychmiast zwraca z bledem. flags == (O_NONBLOCK | O_TRUNC) Modul jest natychmiast usuwany, niezaleznie od tego, czy posiada zerowy licznik odniesien. (flags & O_NONBLOCK) == 0 Jesli we flags nie podano O_NONBLOCK, to zachodza nastepujace kroki: o Modul jest oznaczany, dzieki czemu niedozwolone sa nowe odniesienia. o Jesli licznik odniesien modulu jest niezerowy, to wywolujacy jest umieszczany w nieprzerywalnym stanie snu (TASK_UNINTERRUPTIBLE) do osiagniecia przez licznik wartosci zero, kiedy wywolanie jest odblokowywane. o Modul jest usuwany w zwykly sposob. Znacznik O_TRUNC ma jeden dodatkowy skutek wobec powyzszych regul. Domyslnie, jesli modul ma funkcje init, lecz nie posiada funkcji exit, to proba usuniecia modulu zawodzi. Jesli jednak podano O_TRUNC to ten warunek jest pomijany. Uzywanie znacznika O_TRUNC jest niebezpieczne! Jesli jadro nie zostalo zbudowane z CONFIG_MODULE_FORCE_UNLOAD, znacznik jest po cichu ignorowany (zwykle CONFIG_MODULE_FORCE_UNLOAD jest wlaczony). Uzywanie tego znacznika prowadzi do skazenia jadra (TAINT_FORCED_RMMOD). WARTOSC ZWRACANA Po pomyslnym zakonczeniu zwracane jest zero. Po bledzie zwracane jest -1 i ustawiane jest errno wskazujac blad. BLEDY EBUSY Modul nie jest ,,zywy" (tzn. wciaz jest inicjowany lub zostal juz oznaczony do usuniecia) lub modul posiada funkcje init, ale nie ma funkcji exit a we flags nie podano O_TRUNC. EFAULT name odnosi sie do polozenia, ktore jest poza dostepna dla procesu przestrzenia adresowa. ENOENT Nie istnieje modul o tej nazwie. EPERM Wywolujacy nie byl uprzywilejowany (nie posiadal przywileju (ang. capability) CAP_SYS_MODULE) lub usuwanie modulow jest wylaczone (zob. /proc/sys/kernel/modules_disabled w proc(5)). EWOULDBLOCK Od tego modulu zaleza inne moduly; albo we flags podano O_NONBLOCK, lecz licznik odniesien tego modulu jest niezerowy i we flags nie podano O_TRUNC. STANDARDY Linux. HISTORIA Wywolanie systemowe delete_module() nie jest obslugiwane przez glibc. W naglowkach glibc nie ma jego deklaracji, ale z powodow pewnych zaszlosci historycznych wersje przed glibc 2.23 eksportowaly ABI dla tego wywolania systemowego. Z tego powodu, aby go uzyc wystarczy (przed glibc 2.23) manualnie zadeklarowac interfejs w swoim kodzie; alternatywnie mozna wywolac to wywolanie systemowe za pomoca syscall(2). Linux 2.4 i wczesniejsze W Linuksie 2.4 i wczesniejszych, wywolanie systemowe przyjmowalo jedynie jeden argument: int delete_module(const char *name); Gdy name wynosi NULL, wszystkie nieuzywane moduly oznaczone auto-clean sa usuwane. Pewne dalsze detale na temat roznic w zachowaniu delete_module() w Linuksie 2.4 i wczesniejszych nie sa obecnie wytlumaczone w niniejszym podreczniku. UWAGI Nieprzerywalny stan snu, ktory moze sie zdarzyc, gdy pominie sie O_NONBLOCK z flags jest uwazany za niepozadany, poniewaz spiacy proces pozostawiany jest w stanie niesmiertelnosci. Wedlug stanu na Linux 3.7, podawanie O_NONBLOCK jest opcjonalne, ale w przyszlych jadrach prawdopodobnie stanie sie to obowiazkowe. ZOBACZ TAKZE create_module(2), init_module(2), query_module(2), lsmod(8), modprobe(8), rmmod(8) TLUMACZENIE Autorami polskiego tlumaczenia niniejszej strony podrecznika sa: Przemek Borys i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.06 31 pazdziernika 2023 r. delete_module(2)