execveat(2) System Calls Manual execveat(2)

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

Biblioteca C standard (libc, -lc)

#include <linux/fcntl.h>      /* Definirea constantelor AT_* */
#include <unistd.h>
int execveat(int dirfd, const char *pathname,
             char *const _Nullable argv[],
             char *const _Nullable envp[],
             int flags);

Apelul de sistem execveat() execută programul la care se face referire prin combinația dintre dirfd și pathname. 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 numele de rută dat în pathname este relativ, atunci acesta este interpretat în raport cu directorul la care face referire descriptorul de fișier dirfd (mai degrabă decât în raport cu directorul de lucru curent al procesului apelant, așa cum face execve(2) pentru un nume de rută relativ).

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

Dacă nume-rută este absolut, atunci dirfd este ignorat.

Dacă pathname 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, mai degrabă decât la un director).

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

Dacă pathname 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).
În cazul în care fișierul identificat de dirfd și un nume de rută pathname non-NULL este o legătură simbolică, atunci apelul eșuează cu eroarea ELOOP.

Î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():

este relativ, dar dirfd nu este nici AT_FDCWD, nici un descriptor de fișier valid.
Fanion nevalid specificat în fanioane.
Fanioanele flags includ AT_SYMLINK_NOFOLLOW, iar fișierul identificat prin dirfd și un pathname non-NULL este o legătură simbolică.
Programul identificat de dirfd și pathname 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.
nume-rută este relativ și dirfd este un descriptor de fișier ce se referă la un alt fișier decât un director.

Linux.

Linux 3.19, glibc 2.34.

Î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 pathname; în acest caz, P este valoarea dată în pathname.

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).

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().

execve(2), openat(2), fexecve(3)

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