.\" -*- coding: UTF-8 -*- .\" Copyright (c) 1999 Andries Brouwer (aeb@cwi.nl), 1 Nov 1999 .\" and Copyright 2006, 2012, 2017 Michael Kerrisk .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\" 1999-11-10: Merged text taken from the page contributed by .\" Reed H. Petty (rhp@draper.net) .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH vfork 2 "2 mai 2024" "Pagini de manual de Linux 6.9.1" .SH NUME vfork \- creează un proces copil și blochează părintele .SH BIBLIOTECA Biblioteca C standard (\fIlibc\fP, \fI\-lc\fP) .SH SINOPSIS .nf \fB#include \fP .P \fBpid_t vfork(void);\fP .fi .P .RS -4 Cerințe pentru macrocomenzi de testare a caracteristicilor pentru glibc (consultați \fBfeature_test_macros\fP(7)): .RE .P \fBvfork\fP(): .nf .\" || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED Începând cu glibc 2.12: (_XOPEN_SOURCE >= 500) && ! (_POSIX_C_SOURCE >= 200809L) || /* Începând cu glibc 2.19: */ _DEFAULT_SOURCE || /* glibc <= 2.19: */ _BSD_SOURCE Înainte de glibc 2.12: _BSD_SOURCE || _XOPEN_SOURCE >= 500 .fi .SH DESCRIERE .SS "Descrierea standard" (Din POSIX.1 ) Funcția \fBvfork\fP() are același efect ca și \fBfork\fP(2), cu excepția faptului că comportamentul este nedefinit dacă procesul creat de \fBvfork\fP() fie modifică alte date decât o variabilă de tip \fIpid_t\fP utilizată pentru a stoca valoarea de returnare de la \fBvfork\fP(), fie returnează din funcția în care a fost apelată \fBvfork\fP(), fie apelează orice altă funcție înainte de a apela cu succes \fB_exit\fP(2) sau una dintre funcțiile din familia \fBexec\fP(3). .SS "Descrierea Linux" \fBvfork\fP(), la fel ca \fBfork\fP(2), creează un proces\-copil al procesului apelant. Pentru detalii și valoarea de returnare și erori, consultați \fBfork\fP(2). .P \fBvfork\fP() este un caz special de \fBclone\fP(2). Acesta este utilizat pentru a crea procese noi fără a copia tabelele de pagini ale procesului părinte. Aceasta poate fi utilă în aplicațiile sensibile la performanță în care se creează un proces\-copil care apoi emite imediat un \fBexecve\fP(2). .P \fBvfork\fP() diferă de \fBfork\fP(2) prin faptul că firul apelant este suspendat până când firul copil termină (fie în mod normal, prin apelarea \fB_exit\fP(2), fie în mod anormal, după transmiterea unui semnal fatal), sau efectuează un apel la \fBexecve\fP(2). Până în acel moment, copilul împarte toată memoria cu părintele său, inclusiv stiva. Copilul nu trebuie să se întoarcă din funcția curentă sau să apeleze \fBexit\fP(3) (care ar avea ca efect apelarea gestionarilor de ieșire stabiliți de procesul părinte și golirea tampoanelor \fBstdio\fP(3) ale părintelui), dar poate apela \fB_exit\fP(2). .P Ca și în cazul \fBfork\fP(2), procesul\-copil creat de \fBvfork\fP() moștenește copii ale diferitelor atribute ale procesului apelantului (de exemplu, descriptori de fișiere, dispoziții de semnal și directorul curent de lucru); apelul \fBvfork\fP() diferă doar în ceea ce privește tratarea spațiului de adrese virtuale, așa cum s\-a descris mai sus. .P Semnalele trimise părintelui sosesc după ce copilul eliberează memoria părintelui (de exemplu, după ce copilul termină sau apelează \fBexecve\fP(2)). .SS "Descrierea istorică (veche)" În Linux, \fBfork\fP(2) este implementat folosind pagini copy\-on\-write, astfel încât singura penalizare suferită de \fBfork\fP(2) este timpul și memoria necesare pentru a duplica tabelele de pagini ale părintelui și pentru a crea o structură de sarcini unică pentru copil. Cu toate acestea, în vremurile de demult, un \fBfork\fP(2) ar fi necesitat realizarea unei copii complete a spațiului de date al apelantului, adesea inutil, deoarece, de obicei, imediat după aceea se realizează un \fBexec\fP(3). Astfel, pentru o mai mare eficiență, BSD a introdus apelul de sistem \fBvfork\fP(), care nu copia complet spațiul de adrese al procesului părinte, ci împrumuta memoria și firul de control al părintelui până la un apel la \fBexecve\fP(2) sau până la o ieșire. Procesul părinte a fost suspendat în timp ce copilul folosea resursele sale. Utilizarea \fBvfork\fP() era complicată: de exemplu, pentru a nu modifica datele din procesul părinte, era necesar să se cunoască variabilele care se aflau într\-un registru. .SH VERSIUNI .\" In AIXv3.1 vfork is equivalent to fork. Cerințele impuse lui \fBvfork\fP() de către standarde sunt mai slabe decât cele impuse lui \fBfork\fP(2), astfel încât o implementare în care cele două sunt sinonime este conformă. În special, programatorul nu se poate baza pe faptul că părintele rămâne blocat până când copilul fie se termină, fie apelează \fBexecve\fP(2) și nu se poate baza pe niciun comportament specific cu privire la memoria partajată. .P Unii consideră că semantica lui \fBvfork\fP() este un defect arhitectural, iar pagina de manual 4.2BSD afirmă: „Acest apel de sistem va fi eliminat atunci când sunt implementate mecanisme adecvate de partajare a sistemului. Utilizatorii nu ar trebui să depindă de semantica de partajare a memoriei a \fIvfork\fP deoarece, în acest caz, va fi sinonim cu \fIfork\fP.” Cu toate acestea, chiar dacă hardware\-ul modern de gestionare a memoriei a redus diferența de performanță dintre \fBfork\fP(2) și \fBvfork\fP(), există diverse motive pentru care Linux și alte sisteme au păstrat \fBvfork\fP(): .IP \[bu] 3 Unele aplicații cu performanțe critice necesită micul avantaj de performanță conferit de \fBvfork\fP(). .IP \[bu] .\" http://stackoverflow.com/questions/4259629/what-is-the-difference-between-fork-and-vfork .\" http://developers.sun.com/solaris/articles/subprocess/subprocess.html .\" http://mailman.uclinux.org/pipermail/uclinux-dev/2009-April/000684.html .\" Funcția \fBvfork\fP() poate fi implementată pe sisteme care nu dispun de o unitate de gestionare a memoriei (MMU), dar funcția \fBfork\fP(2) nu poate fi implementată pe astfel de sisteme. (POSIX.1\-2008 a eliminat \fBvfork\fP() din standard; justificarea POSIX pentru funcția \fBposix_spawn\fP(3) menționează că această funcție, care oferă o funcționalitate echivalentă cu \fBfork\fP(2)+ \fBexec\fP(3), este concepută pentru a putea fi implementată pe sisteme care nu dispun de o MMU). .IP \[bu] Pe sistemele în care memoria este limitată, \fBvfork\fP() evită necesitatea de a angaja temporar memoria (a se vedea descrierea \fI/proc/sys/vm/overcommit_memory\fP în \fBproc\fP(5)) pentru a executa un program nou. (Acest lucru poate fi deosebit de benefic în cazul în care un proces părinte mare dorește să execute un mic program ajutător într\-un proces copil). În schimb, utilizarea \fBfork\fP(2) în acest scenariu necesită fie angajarea unei cantități de memorie egală cu dimensiunea procesului părinte (în cazul în care este în vigoare supraangajarea strictă), fie supraangajarea memoriei cu riscul ca un proces să fie întrerupt de oom\-killer. .SS "Note Linux" Gestionarii de bifurcare stabiliți utilizând \fBpthread_atfork\fP(3) nu sunt apelați atunci când un program multi\-fir care utilizează biblioteca multi\-fire NPTL apelează \fBvfork\fP(). În acest caz, gestionarii de bifurcări sunt apelați într\-un program care utilizează biblioteca multi\-fire LinuxThreads. Consultați \fBpthreads\fP(7) pentru o descriere a bibliotecilor de multi\-fire Linux. .P Un apel la \fBvfork\fP() este echivalent cu un apel la \fBclone\fP(2) cu \fIflags\fP specificat ca: .P .in +4n .EX CLONE_VM | CLONE_VFORK | SIGCHLD .EE .in .SH STANDARDE Niciunul. .SH ISTORIC 4.3BSD; POSIX.1\-2001 (dar marcat ca OBSOLET). POSIX.1\-2008 elimină specificația \fBvfork\fP(). .P .\" In the release notes for 4.2BSD Sam Leffler wrote: `vfork: Is still .\" present, but definitely on its way out'. .\" Apelul de sistem \fBvfork\fP() a apărut în 3.0BSD. În 4.4BSD a devenit sinonim cu \fBfork\fP(2), dar NetBSD l\-a introdus din nou; a se vedea .UR http://www.netbsd.org\:/Documentation\:/kernel\:/vfork.html .UE . În Linux, a fost echivalent cu \fBfork\fP(2) până la Linux 2.2.0\-pre6 aproximativ. De la Linux 2.2.0\-pre9 (pe i386, ceva mai târziu pe alte arhitecturi) este un apel de sistem independent. Suportul pentru acesta a fost adăugat în glibc 2.0.112. .SH AVERTISMENTE Procesul\-copil trebuie să aibă grijă să nu modifice memoria în moduri neintenționate, deoarece astfel de modificări vor fi văzute de procesul părinte odată ce copilul termină sau execută un alt program. În această privință, gestionarii de semnal pot fi deosebit de problematici: dacă un gestionar de semnal care este invocat în copilul lui \fBvfork\fP() modifică memoria, aceste modificări pot duce la o stare inconsecventă a procesului din perspectiva procesului părinte (de exemplu, modificările de memorie ar fi vizibile în procesul părinte, dar modificările stării descriptorilor de fișiere deschise nu ar fi vizibile). .P .\" Atunci când \fBvfork\fP() este apelat într\-un proces cu mai multe fire de execuție, numai firul de execuție apelant este suspendat până când copilul termină sau execută un nou program. Aceasta înseamnă că copilul împarte un spațiu de adrese cu alt cod care rulează. Acest lucru poate fi periculos dacă un alt fir de execuție din procesul părinte își schimbă acreditările (utilizând \fBsetuid\fP(2) sau similar), deoarece există acum două procese cu niveluri de privilegii diferite care rulează în același spațiu de adrese. Ca exemplu al pericolelor, să presupunem că un program cu mai multe fire de execuție care rulează ca root creează un copil folosind \fBvfork\fP(). După \fBvfork\fP(), un fir de execuție din procesul părinte scade procesul la un utilizator fără privilegii pentru a rula un cod de neîncredere (de exemplu, poate prin intermediul unui modul deschis cu \fBdlopen\fP(3)). În acest caz, sunt posibile atacuri în care procesul părinte utilizează \fBmmap\fP(2) pentru a pune în memorie codul care va fi executat de procesul copil privilegiat. .SH ERORI .\" .\" As far as I can tell, the following is not true in Linux 2.6.19: .\" Currently (Linux 2.3.25), .\" .BR strace (1) .\" cannot follow .\" .BR vfork () .\" and requires a kernel patch. Detaliile de gestionare a semnalelor sunt obscure și diferă de la un sistem la altul. Pagina de manual BSD afirmă: „Pentru a evita o posibilă situație de blocaj, procesele care sunt copii în mijlocul unui \fBvfork\fP() nu primesc niciodată semnale \fBSIGTTOU\fP sau \fBSIGTTIN\fP; mai degrabă, sunt permise ieșirile sau \fIioctl\fPs, iar încercările de intrare au ca rezultat o indicație de sfârșit de fișier.” .SH "CONSULTAȚI ȘI" \fBclone\fP(2), \fBexecve\fP(2), \fB_exit\fP(2), \fBfork\fP(2), \fBunshare\fP(2), \fBwait\fP(2) .PP .SH TRADUCERE Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu . .PP Această traducere este documentație gratuită; citiți .UR https://www.gnu.org/licenses/gpl-3.0.html Licența publică generală GNU Versiunea 3 .UE sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE. .PP Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la .MT translation-team-ro@lists.sourceforge.net .ME .