delete_module(2) | System Calls Manual | 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 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.
2 mai 2024 | Pagini de manual de Linux 6.8 |