table of contents
delete_module(2) | System Calls Manual | 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¶
Autorami polskiego tłumaczenia niniejszej strony podręcznika są: 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 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.
2 maja 2024 r. | Linux man-pages (niewydane) |