plucky (2) delete_module.2.gz

Provided by: manpages-pl-dev_4.25.1-1_all bug

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  ⟨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⟩.