PR_SET_SYSCALL_USER_DISPATCH(2const)

NUME
PR_SET_SYSCALL_USER_DISPATCH - stabilește mecanismul de dispecerizare a utilizatorului apelului de sistem pentru firul apelant

BIBLIOTECA
Biblioteca C standard (libc, -lc)

SINOPSIS
#include <linux/prctl.h>  /* Definirea constantelor PR_* */
#include <sys/prctl.h>

int prctl(PR_SET_SYSCALL_USER_DISPATCH, long op, ...);

int prctl(PR_SET_SYSCALL_USER_DISPATCH, PR_SYS_DISPATCH_ON,
          unsigned long off, unsigned long size, int8_t *switch);
int prctl(PR_SET_SYSCALL_USER_DISPATCH, PR_SYS_DISPATCH_OFF, 0L, 0L, 0L);

DESCRIERE
Configurează mecanismul Syscall User Dispatch pentru firul apelant. Acest mecanism permite unei aplicații să intercepteze selectiv apelurile sistemului astfel încât acestea să poată fi gestionate în cadrul aplicației. Interceptarea ia forma unui semnal SIGSYS direcționat către fir care este transmis firului atunci când acesta efectuează un apel de sistem. Dacă este interceptat, apelul de sistem nu este executat de către nucleu.

PR_SYS_DISPATCH_ON
    Activează acest mecanism.

    Odată activate, alte apeluri sistem vor fi interceptate selectiv, în funcție de o variabilă de control furnizată de spațiul utilizatorului. În acest caz, off și, respectiv, size identifică poziția și dimensiunea unei singure regiuni de memorie contigue din spațiul de adrese al procesului, din care se permite întotdeauna executarea apelurilor sistem, indiferent de variabila de control. (De obicei, această zonă ar include zona de memorie care conține biblioteca C).

    switch indică o variabilă care este un comutator rapid pentru a permite/bloca executarea apelurilor de sistem fără a mai fi nevoie de un alt apel de sistem pentru a reconfigura Syscall User Dispatch. Această variabilă de control poate fi definită fie la SYSCALL_DISPATCH_FILTER_BLOCK pentru a bloca executarea apelurilor sistemului, fie la SYSCALL_DISPATCH_FILTER_ALLOW pentru a permite temporar executarea acestora. Această valoare este verificată de nucleu la fiecare intrare a apelului de sistem, iar orice valoare neașteptată va genera un SIGSYS de neatins în acel moment, omorând aplicația.

    Atunci când un apel sistem este interceptat, nucleul trimite un semnal SIGSYS direcționat către firul declanșator. Diverse câmpuri vor fi definite în structura siginfo_t (a se vedea sigaction(2)) asociată cu semnalul:

    •   si_signo va conține SIGSYS.

    •   si_call_addr va afișa adresa instrucțiunii apelului de sistem.

    •   si_syscall și si_arch vor indica ce apel de sistem a fost încercat.

    •   si_code va conține SYS_USER_DISPATCH.

    •   si_errno va fi stabilită la 0.

    Contorul de program va fi ca și cum apelul de sistem ar fi avut loc (adică, contorul de program nu va indica instrucțiunea de apel de sistem).

    Atunci când gestionarul de semnal returnează la nucleu, apelul de sistem se finalizează imediat și returnează la firul apelant, fără a fi executat efectiv. Dacă este necesar (de exemplu, la emularea apelului de sistem în spațiul utilizator), gestionarul de semnal ar trebui să definească valoarea de returnare a apelului de sistem la o valoare corectă, prin modificarea contextului registrului stocat în argumentul ucontext al gestionarului de semnal. Consultați sigaction(2), sigreturn(2) și getcontext(3) pentru mai multe informații.

PR_SYS_DISPATCH_OFF
    Syscall User Dispatch este dezactivat pentru acest fir.

Parametrul nu este păstrat în fork(2), clone(2) sau execve(2).

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

ERORI-IEȘIRE

EFAULT
    switch nu este o adresă validă.

EINVAL
    op este PR_SYS_DISPATCH_ON și intervalul de memorie specificat este în afara spațiului de adrese al procesului.

EINVAL
    op nu este valid.

STANDARDE
Linux. Doar x86.

ISTORIC
Linux 5.11 (x86).

CONSULTAȚI ȘI
prctl(2)

Pentru mai multe informații, consultați fișierul sursă al nucleului Documentation/admin-guide/syscall-user-dispatch.rst

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.