dup(2) System Calls Manual dup(2) NUME dup, dup2, dup3 - duplica un descriptor de fiier BIBLIOTECA Biblioteca C standard (libc, -lc) SINOPSIS #include int dup(int oldfd); int dup2(int oldfd, int newfd); #define _GNU_SOURCE /* Consultai feature_test_macros(7) */ #include /* Definirea constantelor O_* */ #include int dup3(int oldfd, int newfd, int flags); DESCRIERE Apelul de sistem dup() aloca un nou descriptor de fiier care se refera la aceeai descriere de fiier deschis ca descriptorul oldfd (pentru o explicaie a descrierilor de fiiere deschise, consultai open(2)). Numarul noului descriptor de fiier este garantat a fi cel mai mic descriptor de fiier care nu a fost utilizat in procesul apelant. Dupa o returnare reuita, descriptorii de fiier vechi i nou pot fi utilizai in mod interschimbabil. Deoarece cei doi descriptori de fiier se refera la aceeai descriere de fiier deschis, acetia au in comun indicatorii de poziie i de stare a fiierului; de exemplu, daca poziia fiierului este modificata prin utilizarea lseek(2) pe unul dintre descriptorii de fiier, poziia este modificata i pentru celalalt descriptor de fiier. Cei doi descriptori de fiier nu au in comun fanioanele descriptorului de fiier (fanionul close-on-exec). Fanionul close-on-exec (FD_CLOEXEC; a se vedea fcntl(2)) pentru descriptorul duplicat este dezactivat. dup2() Apelul de sistem dup2() indeplinete aceeai sarcina ca i dup(), dar in loc sa utilizeze descriptorul de fiier neutilizat cu cel mai mic numar, utilizeaza numarul descriptorului de fiier specificat in newfd. Cu alte cuvinte, descriptorul de fiier newfd este ajustat astfel incat sa se refere acum la aceeai descriere de fiier deschis ca oldfd. In cazul in care descriptorul de fiier newfd a fost deschis anterior, acesta este inchis inainte de a fi reutilizat; inchiderea este efectuata in mod silenios (de exemplu, eventualele erori din timpul inchiderii nu sunt raportate de dup2()). Etapele de inchidere i reutilizare a descriptorului de fiier newfd sunt efectuate atomic. Acest lucru este important, deoarece incercarea de a pune in aplicare o funcionalitate echivalenta folosind close(2) i dup() ar fi supusa unor condiii de cursa, prin care newfd ar putea fi reutilizat intre cele doua etape. O astfel de reutilizare ar putea avea loc deoarece programul principal este intrerupt de un gestionar de semnal care aloca un descriptor de fiier sau deoarece un fir paralel aloca un descriptor de fiier. Reinei urmatoarele puncte: o Daca oldfd nu este un descriptor de fiier valid, apelul eueaza, iar newfd nu este inchis. o Daca oldfd este un descriptor de fiier valid, iar newfd are aceeai valoare ca oldfd, atunci dup2() nu face nimic i returneaza newfd. dup3() dup3() este la fel ca dup2(), cu excepia faptului ca: o Apelantul poate fora activarea indicatorului close-on-exec pentru noul descriptor de fiier prin specificarea O_CLOEXEC in flags. A se vedea descrierea aceluiai fanion in open(2) pentru motivele pentru care acest lucru poate fi util. o Daca oldfd este egal cu newfd, atunci dup3() eueaza cu eroarea EINVAL. VALOAREA RETURNATA In caz de succes, aceste apeluri de sistem returneaza noul descriptor de fiier. In caz de eroare, este returnat -1, iar errno este configurata pentru a indica eroarea. ERORI-IEIRE EBADF oldfd nu este un descriptor de fiier deschis. EBADF newfd este in afara intervalului permis pentru descriptorii de fiiere (a se vedea discuia despre RLIMIT_NOFILE in getrlimit(2)). EBUSY (Numai Linux) Aceasta poate fi returnata de dup2() sau dup3() in timpul unei condiii de cursa cu open(2) i dup(). EINTR Apelul dup2() sau dup3() a fost intrerupt de un semnal; consultai signal(7). EINVAL (dup3()) flags conine o valoare nevalida. EINVAL (dup3()) oldfd a fost egal cu newfd. EMFILE A fost atinsa limita per-proces privind numarul de descriptoare de fiiere deschise (a se vedea discuia despre RLIMIT_NOFILE in getrlimit(2)). ENOMEM Nu a fost disponibila suficienta memorie pentru nucleu. STANDARDE dup() dup2() POSIX.1-2008. dup3() Linux. ISTORIC dup() dup2() POSIX.1-2001, SVr4, 4.3BSD. dup3() Linux 2.6.27, glibc 2.9. NOTE Eroarea returnata de dup2() este diferita de cea returnata de fcntl(..., F_DUPFD, ...) atunci cand newfd iese din interval. Pe unele sisteme, dup2() returneaza uneori i EINVAL ca F_DUPFD. Daca newfd a fost deschis, orice erori care ar fi fost raportate la momentul close(2) sunt pierdute. Daca acest lucru va ingrijoreaza, atunci [em]cu excepia cazului in care programul este cu un singur fir i nu aloca descriptori de fiier in gestionarii de semnal [em]abordarea corecta este sa nu inchidei newfd inainte de a apela dup2(), din cauza condiiei de cursa descrisa mai sus. In schimb, ar putea fi utilizat un cod asemanator cu urmatorul: /* Obine un duplicat al 'newfd' care poate fi utilizat ulterior pentru a verifica erorile close(); o eroare EBADF inseamna ca 'newfd' nu a fost deschis. */ tmpfd = dup(newfd); if (tmpfd == -1 && errno != EBADF) { /* Gestioneaza eroarea neateptata dup(). */ } /* Duplicarea atomica a 'oldfd' pe 'newfd'. */ if (dup2(oldfd, newfd) == -1) { /* Gestioneaza eroarea dup2(). */ } /* Acum verifica daca exista erori close() in fiierul menionat iniial de 'newfd'. */ if (tmpfd != -1) { if (close(tmpfd) == -1) { /* Gestioneaza erorile de la inchidere. */ } } CONSULTAI I close(2), fcntl(2), open(2), pidfd_getfd(2) TRADUCERE Traducerea in limba romana a acestui manual a fost facuta de Remus- Gabriel Chelu Aceasta traducere este documentaie gratuita; citii Licena publica generala GNU Versiunea 3 sau o versiune ulterioara cu privire la condiii privind drepturile de autor. NU se asuma NICIO RESPONSABILITATE. Daca gasii erori in traducerea acestui manual, va rugam sa trimitei un e-mail la . Pagini de manual de Linux 6.15 17 mai 2025 dup(2)