execveat(2)

NUME
execveat - execută programul în raport cu un descriptor de fișier de director

BIBLIOTECA
Biblioteca C standard (libc, -lc)

SINOPSIS
#include <linux/fcntl.h>      /* Definirea constantelor AT_* */
#include <unistd.h>

int execveat(int dirfd, const char *path,
             char *const _Nullable argv[],
             char *const _Nullable envp[],
             int flags);

DESCRIERE
Apelul de sistem execveat() execută programul la care se face referire prin combinația dintre dirfd și path. Funcționează exact în același mod ca și execve(2), cu excepția diferențelor descrise în această pagină de manual.

În cazul în care ruta dată în path este relativă, atunci acesta este interpretată în raport cu directorul la care face referire descriptorul de fișier dirfd (și nu în raport cu directorul de lucru curent al procesului apelant, așa cum face execve(2) pentru un nume de rută relativ).

Dacă ruta path este relativă și dirfd este valoarea specială AT_FDCWD, atunci ruta path este interpretată relativ la directorul de lucru curent al procesului apelant (ca execve(2)).

Dacă ruta este absolută, atunci fd-director este ignorat.

Dacă path este un șir de caractere gol și este specificat fanionul AT_EMPTY_PATH, atunci descriptorul de fișier dirfd specifică fișierul care urmează să fie executat (adică dirfd se referă la un fișier executabil, și nu la un director).

Argumentul flags este o mască de biți care include zero sau mai multe dintre următoarele fanioane:

AT_EMPTY_PATH
    Dacă path este un șir gol, operează pe fișierul la care se face referire prin dirfd (care poate fi obținut cu ajutorul fanionului open(2) O_PATH).

AT_SYMLINK_NOFOLLOW
    În cazul în care fișierul identificat de dirfd și o rută path non-NULL este o legătură simbolică, atunci apelul eșuează cu eroarea ELOOP.

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

ERORI-IEȘIRE
Aceleași erori care apar pentru execve(2) pot apărea și pentru execveat(). Următoarele erori suplimentare pot apărea pentru execveat():

ruta
    este relativ, dar dirfd nu este nici AT_FDCWD, nici un descriptor de fișier valid.

EINVAL
    Fanion nevalid specificat în fanioane.

ELOOP
    Fanioanele flags includ AT_SYMLINK_NOFOLLOW, iar fișierul identificat prin dirfd și o rută path non-NULL este o legătură simbolică.

ENOENT
    Programul identificat de dirfd și path necesită utilizarea unui program de interpretare (cum ar fi un script care începe cu „#!”), dar descriptorul de fișier dirfd a fost deschis cu fanionul O_CLOEXEC, ceea ce face ca fișierul de program să fie inaccesibil pentru interpretul lansat. A se vedea secțiunea ERORI.

ENOTDIR
    ruta este relativă și dirfd este un descriptor de fișier ce se referă la un alt fișier decât un director.

STANDARDE
Linux.

ISTORIC
Linux 3.19, glibc 2.34.

NOTE
În plus față de motivele explicate în openat(2), apelul de sistem execveat() este, de asemenea, necesar pentru a permite ca fexecve(3) să fie implementat pe sisteme care nu au montat sistemul de fișiere /proc.

Atunci când i se cere să execute un fișier script, argv[0] care este transmis interpretului de script este un șir de caractere de forma /dev/fd/N sau /dev/fd/N/P, unde N este numărul descriptorului de fișier transmis prin intermediul argumentului dirfd. Un șir de prima formă apare atunci când se utilizează AT_EMPTY_PATH. Un șir de forma a doua apare atunci când scriptul este specificat atât prin dirfd, cât și prin path; în acest caz, P este valoarea dată în path.

Din aceleași motive descrise la fexecve(3), modul natural de lucru atunci când se utilizează execveat() este de a defini fanionul close-on-exec pe dirfd; (dar a se vedea secțiunea ERORI).

ERORI
Eroarea ENOENT descrisă mai sus înseamnă că nu este posibil să se definească fanionul close-on-exec pe descriptorul de fișier dat la un apel de forma:

    execveat(fd, "", argv, envp, AT_EMPTY_PATH);

Cu toate acestea, incapacitatea de a defini fanionul close-on-exec înseamnă că un descriptor de fișier care face referire la script se pierde în scriptul în sine. Pe lângă faptul că irosește un descriptor de fișier, această pierdere poate duce la epuizarea descriptorului de fișier în scenariile în care scripturile utilizează recursiv execveat().

CONSULTAȚI ȘI
execve(2), openat(2), fexecve(3)

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.