fexecve(3) Library Functions Manual fexecve(3)

fexecve - execută programul specificat prin intermediul descriptorului de fișier

Biblioteca C standard (libc, -lc)

#include <unistd.h>
int fexecve(int fd, char *const argv[], char *const envp[]);
Cerințe pentru macrocomenzi de testare a caracteristicilor pentru glibc (consultați feature_test_macros(7)):

fexecve():

    Începând cu glibc 2.10
        _POSIX_C_SOURCE >= 200809L
    Înainte de glibc 2.10:
        _GNU_SOURCE

fexecve() îndeplinește aceeași sarcină ca și execve(2), cu diferența că fișierul care urmează să fie executat este specificat printr-un descriptor de fișier, fd, mai degrabă decât printr-un nume de rută. Descriptorul de fișier fd trebuie să fie deschis numai-pentru-citire (O_RDONLY) sau cu fanionul O_PATH, iar apelantul trebuie să aibă permisiunea de a executa fișierul la care se referă.

Un apel reușit la fexecve() nu returnează niciodată. În caz de eroare, funcția returnează, cu o valoare a rezultatului de -1, iar errno este configurată pentru a indica eroarea.

ERORI-IEȘIRE

Erorile sunt ca pentru execve(2), cu următoarele adăugiri:

fd nu este un descriptor de fișier valid, sau argv este NULL, sau envp este NULL.
Fanionul close-on-exec este activat în fd, iar fd se referă la un script. A se vedea ERORI.
Nucleul nu oferă apelul de sistem execveat(2), și sistemul de fișiere /proc nu a putut fi accesat.

Pentru o explicație a termenilor folosiți în această secțiune, a se vedea attributes(7).

Interfață Atribut Valoare
fexecve() Siguranța firelor MT-Safe

POSIX.1-2008.

glibc 2.3.2.

În Linux cu versiunile glibc 2.26 și anterioare, fexecve() este implementată utilizând sistemul de fișiere proc(5), astfel încât /proc trebuie să fie montat și disponibil în momentul apelului. Începând cu glibc 2.27, în cazul în care nucleul subiacent acceptă apelul de sistem execveat(2), atunci fexecve() este implementată utilizând acest apel de sistem, cu avantajul că /proc nu trebuie să fie montat.

Ideea din spatele fexecve() este de a permite apelantului să verifice (suma de control) conținutul unui executabil înainte de a-l executa. Simpla deschidere a fișierului, verificarea sumei de control a conținutului și apoi efectuarea unui execve(2) nu ar fi suficientă, deoarece, între cele două etape, numele fișierului sau un prefix de director al numelui rutei ar fi putut fi schimbat (de exemplu, prin modificarea țintei unei legături simbolice). fexecve() nu atenuează problema că conținutul unui fișier ar putea fi modificat între verificarea sumei de control și apelul la fexecve(); pentru aceasta, soluția este de a se asigura că permisiunile asupra fișierului împiedică modificarea acestuia de către utilizatorii rău intenționați.

Modul firesc de utilizare a fexecve() este de a activa fanionul „close-on-exec” în fd, astfel încât descriptorul de fișier să nu ajungă la programul care este executat. Această abordare este firească din două motive. În primul rând, previne consumarea inutilă a descriptorilor de fișiere (în mod normal, programul executat nu are nevoie de un descriptor de fișier care se referă la programul însuși). În al doilea rând, în cazul în care fexecve() este utilizată în mod recursiv, utilizarea fanionului „closed-on-exec” previne epuizarea descriptorului de fișier care ar rezulta din faptul că fiecare pas în recursivitate ar face ca încă un descriptor de fișier să fie transmis către noul program (dar vedeți secțiunea Erori).

Dacă fd se referă la un script (adică este un fișier text executabil care numește un interpret de script cu o primă linie care începe cu caracterele #!) și dacă pentru fd a fost activat fanionul „close-on-exec”, atunci fexecve() eșuează cu eroarea ENOENT. Această eroare apare deoarece, în momentul în care este executat interpretul scriptului, fd a fost deja închis din cauza fanionului „close-on-exec”. Astfel, fanionul „close-on-exec” nu poate fi activat în fd dacă acesta se referă la un script, ceea ce duce la problemele descrise în NOTE.

execve(2), execveat(2)

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