.\" -*- coding: UTF-8 -*- .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH dup 2 "17 mai 2025" "Pagini de manual de Linux 6.15" .SH NUME dup, dup2, dup3 \- duplică un descriptor de fișier .SH BIBLIOTECA Biblioteca C standard (\fIlibc\fP, \fI\-lc\fP) .SH SINOPSIS .nf \fB#include \fP .P \fBint dup(int \fP\fIoldfd\fP\fB);\fP \fBint dup2(int \fP\fIoldfd\fP\fB, int \fP\fInewfd\fP\fB);\fP .P \fB#define _GNU_SOURCE\fP /* Consultați feature_test_macros(7) */ \fB#include \fP /* Definirea constantelor \fBO_*\fP */ \fB#include \fP .P \fBint dup3(int \fP\fIoldfd\fP\fB, int \fP\fInewfd\fP\fB, int \fP\fIflags\fP\fB);\fP .fi .SH DESCRIERE Apelul de sistem \fBdup\fP() alocă un nou descriptor de fișier care se referă la aceeași descriere de fișier deschis ca descriptorul \fIoldfd\fP (pentru o explicație a descrierilor de fișiere deschise, consultați \fBopen\fP(2)). Numărul noului descriptor de fișier este garantat a fi cel mai mic descriptor de fișier care nu a fost utilizat în procesul apelant. .P După o returnare reușită, descriptorii de fișier vechi și nou pot fi utilizați în mod interschimbabil. Deoarece cei doi descriptori de fișier se referă la aceeași descriere de fișier deschis, aceștia au în comun indicatorii de poziție și de stare a fișierului; de exemplu, dacă poziția fișierului este modificată prin utilizarea \fBlseek\fP(2) pe unul dintre descriptorii de fișier, poziția este modificată și pentru celălalt descriptor de fișier. .P .\" Cei doi descriptori de fișier nu au în comun fanioanele descriptorului de fișier (fanionul close\-on\-exec). Fanionul close\-on\-exec (\fBFD_CLOEXEC\fP; a se vedea \fBfcntl\fP(2)) pentru descriptorul duplicat este dezactivat. .SS dup2() Apelul de sistem \fBdup2\fP() îndeplinește aceeași sarcină ca și \fBdup\fP(), dar în loc să utilizeze descriptorul de fișier neutilizat cu cel mai mic număr, utilizează numărul descriptorului de fișier specificat în \fInewfd\fP. Cu alte cuvinte, descriptorul de fișier \fInewfd\fP este ajustat astfel încât să se refere acum la aceeași descriere de fișier deschis ca \fIoldfd\fP. .P În cazul în care descriptorul de fișier \fInewfd\fP a fost deschis anterior, acesta este închis înainte de a fi reutilizat; închiderea este efectuată în mod silențios (de exemplu, eventualele erori din timpul închiderii nu sunt raportate de \fBdup2\fP()). .P Etapele de închidere și reutilizare a descriptorului de fișier \fInewfd\fP sunt efectuate \fIatomic\fP. Acest lucru este important, deoarece încercarea de a pune în aplicare o funcționalitate echivalentă folosind \fBclose\fP(2) și \fBdup\fP() ar fi supusă unor condiții de cursă, prin care \fInewfd\fP ar putea fi reutilizat între cele două etape. O astfel de reutilizare ar putea avea loc deoarece programul principal este întrerupt de un gestionar de semnal care alocă un descriptor de fișier sau deoarece un fir paralel alocă un descriptor de fișier. .P Rețineți următoarele puncte: .IP \[bu] 3 Dacă \fIoldfd\fP nu este un descriptor de fișier valid, apelul eșuează, iar \fInewfd\fP nu este închis. .IP \[bu] .\" Dacă \fIoldfd\fP este un descriptor de fișier valid, iar \fInewfd\fP are aceeași valoare ca \fIoldfd\fP, atunci \fBdup2\fP() nu face nimic și returnează \fInewfd\fP. .SS dup3() \fBdup3\fP() este la fel ca \fBdup2\fP(), cu excepția faptului că: .IP \[bu] 3 Apelantul poate forța activarea indicatorului close\-on\-exec pentru noul descriptor de fișier prin specificarea \fBO_CLOEXEC\fP în \fIflags\fP. A se vedea descrierea aceluiași fanion în \fBopen\fP(2) pentru motivele pentru care acest lucru poate fi util. .IP \[bu] .\" Ulrich Drepper, LKML, 2008-10-09: .\" We deliberately decided on this change. Otherwise, what is the .\" result of dup3(fd, fd, O_CLOEXEC)? Dacă \fIoldfd\fP este egal cu \fInewfd\fP, atunci \fBdup3\fP() eșuează cu eroarea \fBEINVAL\fP. .SH "VALOAREA RETURNATĂ" În caz de succes, aceste apeluri de sistem returnează noul descriptor de fișier. În caz de eroare, este returnat \-1, iar \fIerrno\fP este configurată pentru a indica eroarea. .SH ERORI\-IEȘIRE .TP \fBEBADF\fP \fIoldfd\fP nu este un descriptor de fișier deschis. .TP \fBEBADF\fP \fInewfd\fP este în afara intervalului permis pentru descriptorii de fișiere (a se vedea discuția despre \fBRLIMIT_NOFILE\fP în \fBgetrlimit\fP(2)). .TP \fBEBUSY\fP (Numai Linux) Aceasta poate fi returnată de \fBdup2\fP() sau \fBdup3\fP() în timpul unei condiții de cursă cu \fBopen\fP(2) și \fBdup\fP(). .TP \fBEINTR\fP Apelul \fBdup2\fP() sau \fBdup3\fP() a fost întrerupt de un semnal; consultați \fBsignal\fP(7). .TP \fBEINVAL\fP (\fBdup3\fP()) \fIflags\fP conține o valoare nevalidă. .TP \fBEINVAL\fP (\fBdup3\fP()) \fIoldfd\fP a fost egal cu \fInewfd\fP. .TP \fBEMFILE\fP A fost atinsă limita per\-proces privind numărul de descriptoare de fișiere deschise (a se vedea discuția despre \fBRLIMIT_NOFILE\fP în \fBgetrlimit\fP(2)). .TP \fBENOMEM\fP Nu a fost disponibilă suficientă memorie pentru nucleu. .SH STANDARDE .TP \fBdup\fP() .TQ \fBdup2\fP() POSIX.1\-2008. .TP \fBdup3\fP() Linux. .SH ISTORIC .TP \fBdup\fP() .TQ \fBdup2\fP() .\" SVr4 documents additional .\" EINTR and ENOLINK error conditions. POSIX.1 adds EINTR. .\" The EBUSY return is Linux-specific. POSIX.1\-2001, SVr4, 4.3BSD. .TP \fBdup3\fP() Linux 2.6.27, glibc 2.9. .SH NOTE Eroarea returnată de \fBdup2\fP() este diferită de cea returnată de \fBfcntl(\fP..., \fBF_DUPFD\fP, ...\fB)\fP atunci când \fInewfd\fP iese din interval. Pe unele sisteme, \fBdup2\fP() returnează uneori și \fBEINVAL\fP ca \fBF_DUPFD\fP. .P Dacă \fInewfd\fP a fost deschis, orice erori care ar fi fost raportate la momentul \fBclose\fP(2) sunt pierdute. Dacă acest lucru vă îngrijorează, atunci [em]cu excepția cazului în care programul este cu un singur fir și nu alocă descriptori de fișier în gestionarii de semnal [em]abordarea corectă este să \fInu\fP închideți \fInewfd\fP înainte de a apela \fBdup2\fP(), din cauza condiției de cursă descrisă mai sus. În schimb, ar putea fi utilizat un cod asemănător cu următorul: .P .in +4n .EX /* Obține un duplicat al \[aq]newfd\[aq] care poate fi utilizat ulterior pentru a verifica erorile close(); o eroare EBADF înseamnă că \[aq]newfd\[aq] nu a fost deschis. */ \& tmpfd = dup(newfd); if (tmpfd == \-1 && errno != EBADF) { /* Gestionează eroarea neașteptată dup(). */ } \& /* Duplicarea atomică a \[aq]oldfd\[aq] pe \[aq]newfd\[aq]. */ \& if (dup2(oldfd, newfd) == \-1) { /* Gestionează eroarea dup2(). */ } \& /* Acum verifică dacă există erori close() în fișierul menționat inițial de \[aq]newfd\[aq]. */ \& if (tmpfd != \-1) { if (close(tmpfd) == \-1) { /* Gestionează erorile de la închidere. */ } } .EE .in .SH "CONSULTAȚI ȘI" \fBclose\fP(2), \fBfcntl\fP(2), \fBopen\fP(2), \fBpidfd_getfd\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 .