delete_module(2)

NUME
delete_module - descarcă un modul din nucleu

BIBLIOTECA
Biblioteca C standard (libc, -lc)

SINOPSIS
#include <fcntl.h>            /* Definiția constantelor O_* */
#include <sys/syscall.h>      /* Definiția constantelor SYS_* */
#include <unistd.h>

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

Notă: glibc nu oferă o funcție învăluitoare pentru delete_module(), fiind necesară utilizarea syscall(2).

DESCRIERE
Apelul de sistem delete_module() încearcă să elimine intrarea neutilizată a modulului încărcabil identificat de name. În cazul în care modulul are o funcție exit, atunci funcția respectivă este executată înainte de descărcarea modulului. Argumentul flags este utilizat pentru a modifica comportamentul apelului de sistem, după cum este descris mai jos. Acest apel de sistem necesită privilegii.

Îndepărtarea modulelor se încearcă în conformitate cu următoarele reguli:

(1) Dacă există alte module încărcate care depind de acest modul (adică se referă la simboluri definite în acesta), atunci apelul eșuează.

(2) În caz contrar, dacă numărul de referințe pentru modul (adică numărul de procese care utilizează în prezent modulul) este zero, atunci modulul este descărcat imediat.

(3) Dacă un modul are un număr de referințe diferit de zero, atunci comportamentul depinde de biții activați în flags. În utilizarea normală (a se vedea NOTE), se specifică întotdeauna fanionul O_NONBLOCK, iar fanionul O_TRUNC poate fi specificat suplimentar.

    Diferitele combinații pentru flags au următorul efect:

    flags == O_NONBLOCK
        Apelul returnează imediat, cu o eroare.

    flags == (O_NONBLOCK | O_TRUNC)
        Modulul este descărcat imediat, indiferent dacă are sau nu un număr de referințe diferit de zero.

    (flags & O_NONBLOCK) == 0
        Dacă flags nu specifică O_NONBLOCK, au loc următorii pași:

        •   Modulul este marcat astfel încât să nu fie permise referințe noi.

        •   În cazul în care numărul de referințe al modulului este diferit de zero, apelantul este plasat într-o stare de somn neîntrerupt (TASK_UNINTERRUPTIBLE) până când numărul de referințe este zero, moment în care apelul se deblochează.

        •   Modulul este descărcat în mod obișnuit.

Fanionul O_TRUNC are un efect suplimentar asupra regulilor descrise mai sus. În mod implicit, în cazul în care un modul are o funcție init, dar nu are o funcție exit, atunci încercarea de a elimina modulul eșuează. Cu toate acestea, dacă s-a specificat O_TRUNC, această cerință este ocolită.

Utilizarea fanionului O_TRUNC este periculoasă! Dacă nucleul nu a fost construit cu CONFIG_MODULE_FORCE_UNLOAD, acest fanion este ignorat în tăcere; (în mod normal, CONFIG_MODULE_FORCE_UNLOAD este activat). Utilizarea acestui fanion afectează, „pătează”, nucleul (TAINT_FORCED_RMMOD).

VALOAREA RETURNATĂ
În caz de succes, se returnează zero. În caz de eroare, se returnează -1, iar errno este configurată pentru a indica eroarea.

ERORI-IEȘIRE

EBUSY
    Modulul nu este „viu” (adică este încă în curs de inițializare sau este deja marcat pentru eliminare); sau, modulul are o funcție init, dar nu are o funcție exit, iar O_TRUNC nu a fost specificat în flags.

EFAULT
    name se referă la o locație din afara spațiului de adrese accesibil procesului.

ENOENT
    Nu există niciun modul cu acest nume.

EPERM
    Apelantul nu era privilegiat (nu avea capacitatea CAP_SYS_MODULE) sau descărcarea modulelor este dezactivată (a se vedea /proc/sys/kernel/modules_disabled în proc(5)).

EWOULDBLOCK
    Alte module depind de acest modul; sau, O_NONBLOCK a fost specificat în flags, dar numărul de referințe al acestui modul este diferit de zero și O_TRUNC nu a fost specificat în flags.

STANDARDE
Linux.

ISTORIC
Apelul de sistem delete_module() nu este acceptat de glibc. În antetele glibc nu este furnizată nicio declarație, dar, printr-o ciudățenie a istoriei, versiunile glibc anterioare glibc 2.23 au exportat un ABI pentru acest apel de sistem. Prin urmare, pentru a utiliza acest apel de sistem, este suficient (înainte de glibc 2.23) să declarați manual interfața în codul dumneavoastră; alternativ, puteți invoca apelul de sistem utilizând syscall(2).

  Linux 2.4 și versiunile anterioare
În Linux 2.4 și versiunile anterioare, apelul de sistem avea un singur argument:

int delete_module(const char *name);

Dacă name este NULL, toate modulele nefolosite marcate „auto-clean” (auto-curățare) sunt eliminate.

Unele detalii suplimentare privind diferențele de comportament ale delete_module() în Linux 2.4 și versiunile anterioare nu sunt explicate în prezent în această pagină de manual.

NOTE
Somnul neîntrerupt care poate apărea dacă O_NONBLOCK este omis din flags este considerat indezirabil, deoarece procesul care doarme este lăsat într-o stare de nestingherit. Ca și în Linux 3.7, specificarea O_NONBLOCK este opțională, dar în nucleele viitoare este posibil să devină obligatorie.

CONSULTAȚI ȘI
create_module(2), init_module(2), query_module(2), lsmod(8), modprobe(8), rmmod(8)

TRADUCERE
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 (https://www.gnu.org/licenses/gpl-3.0.html) sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.