delete_module(2)

NAZWA
delete_module - usuwa (odłącza) moduł jądra

BIBLIOTEKA
Standardowa biblioteka C (libc, -lc)

SKŁADNIA
#include <fcntl.h>            /* Definicja stałych O_* */
#include <sys/syscall.h>      /* Definicja stałych SYS_* */
#include <unistd.h>

int syscall(SYS_delete_module, const char *name, unsigned int flags);

Uwaga: glibc nie udostępnia opakowania dla delete_module(), co wymusza użycie syscall(2).

OPIS
Wywołanie systemowe delete_module() próbuje usunąć nieużywany, ładowalny wpis modułu określony nazwą name. Jeśli moduł posiada funkcję exit, to jest ona wykonywana przed usunięciem modułu. Argument flags służy do modyfikacji zachowania wywołania systemowego, zgodnie z opisem poniżej. To wywołanie systemowe wymaga uprzywilejowania.

Próba usunięcia modułu zachodzi zgodnie z poniższymi regułami:

(1) Jeśli występują inne załadowane moduły zależące od tego modułu (tzn. odniesienia do symboli w nim zdefiniowanych), to wywołanie zawodzi.

(2) W przeciwnym razie, jeśli licznik odniesień do modułu (tzn. liczba procesów używających go aktualnie) wynosi zero, to moduł jest natychmiast usuwany.

(3) Jeśli moduł ma niezerowy licznik odniesień, to zachowanie zależy od bitów ustawionych w flags. Przy zwykłym użyciu (zob. UWAGI), podany jest zawsze znacznik O_NONBLOCK, dodatkowo można też podać znacznik O_TRUNC.

    Różne zestawienia flags dają następujący rezultat:

    flags == O_NONBLOCK
        Wywołanie natychmiast zwraca z błędem.

    flags == (O_NONBLOCK | O_TRUNC)
        Moduł jest natychmiast usuwany, niezależnie od tego, czy posiada zerowy licznik odniesień.

    (flags & O_NONBLOCK) == 0
        Jeśli we flags nie podano O_NONBLOCK, to zachodzą następujące kroki:

        •   Moduł jest oznaczany, dzięki czemu niedozwolone są nowe odniesienia.

        •   Jeśli licznik odniesień modułu jest niezerowy, to wywołujący jest umieszczany w nieprzerywalnym stanie snu (TASK_UNINTERRUPTIBLE) do osiągnięcia przez licznik wartości zero, kiedy wywołanie jest odblokowywane.

        •   Moduł jest usuwany w zwykły sposób.

Znacznik O_TRUNC ma jeden dodatkowy skutek wobec powyższych reguł. Domyślnie, jeśli moduł ma funkcję init, lecz nie posiada funkcji exit, to próba usunięcia modułu zawodzi. Jeśli jednak podano O_TRUNC to ten warunek jest pomijany.

Używanie znacznika O_TRUNC jest niebezpieczne! Jeśli jądro nie zostało zbudowane z CONFIG_MODULE_FORCE_UNLOAD, znacznik jest po cichu ignorowany (zwykle CONFIG_MODULE_FORCE_UNLOAD jest włączony). Używanie tego znacznika prowadzi do skażenia jądra (TAINT_FORCED_RMMOD).

WARTOŚĆ ZWRACANA
Po pomyślnym zakończeniu zwracane jest zero. Po błędzie zwracane jest -1 i ustawiane jest errno wskazując błąd.

BŁĘDY

EBUSY
    Moduł nie jest „żywy” (tzn. wciąż jest inicjowany lub został już oznaczony do usunięcia) lub moduł posiada funkcję init, ale nie ma funkcji exit a we flags nie podano O_TRUNC.

EFAULT
    name odnosi się do położenia, które jest poza dostępną dla procesu przestrzenią adresową.

ENOENT
    Nie istnieje moduł o tej nazwie.

EPERM
    Wywołujący nie był uprzywilejowany (nie posiadał przywileju (ang. capability) CAP_SYS_MODULE) lub usuwanie modułów jest wyłączone (zob. /proc/sys/kernel/modules_disabled w proc(5)).

EWOULDBLOCK
    Od tego modułu zależą inne moduły; albo we flags podano O_NONBLOCK, lecz licznik odniesień tego modułu jest niezerowy i we flags nie podano O_TRUNC.

STANDARDY
Linux.

HISTORIA
Wywołanie systemowe delete_module() nie jest obsługiwane przez glibc. W nagłówkach glibc nie ma jego deklaracji, ale z powodów pewnych zaszłości historycznych wersje przed glibc 2.23 eksportowały ABI dla tego wywołania systemowego. Z tego powodu, aby go użyć wystarczy (przed glibc 2.23) manualnie zadeklarować interfejs w swoim kodzie; alternatywnie można wywołać to wywołanie systemowe za pomocą syscall(2).

  Linux 2.4 i wcześniejsze
W Linuksie 2.4 i wcześniejszych, wywołanie systemowe przyjmowało jedynie jeden argument:

int delete_module(const char *name);

Gdy name wynosi NULL, wszystkie nieużywane moduły oznaczone auto-clean są usuwane.

Pewne dalsze detale na temat różnic w zachowaniu delete_module() w Linuksie 2.4 i wcześniejszych nie są obecnie wytłumaczone w niniejszym podręczniku.

UWAGI
Nieprzerywalny stan snu, który może się zdarzyć, gdy pominie się O_NONBLOCK z flags jest uważany za niepożądany, ponieważ śpiący proces pozostawiany jest w stanie nieśmiertelności. Według stanu na Linux 3.7, podawanie O_NONBLOCK jest opcjonalne, ale w przyszłych jądrach prawdopodobnie stanie się to obowiązkowe.

ZOBACZ TAKŻE
create_module(2), init_module(2), query_module(2), lsmod(8), modprobe(8), rmmod(8)

TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika: Przemek Borys <pborys@dione.ids.pl> i Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 (https://www.gnu.org/licenses/gpl-3.0.html) lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.