close(2) System Calls Manual close(2) NUME close - inchide un descriptor de fiier BIBLIOTECA Biblioteca C standard (libc, -lc) SINOPSIS #include int close(int fd); DESCRIERE close() inchide un descriptor de fiier, astfel incat acesta sa nu se mai refere la niciun fiier i sa poata fi reutilizat. Orice blocare de inregistrare (a se vedea fcntl(2)) deinuta pe fiierul cu care a fost asociata i deinuta de proces este eliminata, indiferent de descriptorul de fiier care a fost utilizat pentru obinerea blocarii. Acest lucru are unele consecine nefericite i trebuie sa fii foarte ateni atunci cand utilizai blocarea inregistrarii consultative. A se vedea fcntl(2) pentru discutarea riscurilor i consecinelor, precum i pentru blocajele de descriere a fiierului deschis (probabil preferate). Daca fd este ultimul descriptor de fiier care se refera la descrierea fiierului deschis subiacent (a se vedea open(2)), resursele asociate descrierii fiierului deschis sunt eliberate; daca descriptorul de fiier a fost ultima referina la un fiier care a fost eliminat utilizand unlink(2), fiierul este ters. VALOAREA RETURNATA close() returneaza zero in caz de succes. In caz de eroare, este returnat -1, iar errno este configurata pentru a indica eroarea. ERORI-IEIRE EBADF fd nu este un descriptor de fiier deschis valid. EINTR Apelul close() a fost intrerupt de un semnal; consultai signal(7). EIO A aparut o eroare de In/Ie. ENOSPC EDQUOT Pe NFS, aceste erori nu sunt in mod normal raportate la prima scriere care depaete spaiul de stocare disponibil, ci la o scriere ulterioara write(2), fsync(2) sau close(). Consultai seciunea NOTE pentru o discuie a motivului pentru care close() nu ar trebui sa fie reapelat dupa o eroare. STANDARDE POSIX.1-2008. ISTORIC POSIX.1-2001, SVr4, 4.3BSD. NOTE O inchidere reuita nu garanteaza ca datele au fost salvate cu succes pe disc, deoarece nucleul utilizeaza memoria cache pentru a amana scrierile. De obicei, sistemele de fiiere nu curaa tampoanele atunci cand un fiier este inchis. Daca trebuie sa fii siguri ca datele sunt stocate fizic pe discul de baza, utilizai fsync(2); (aceasta va depinde de hardware-ul discului in acest moment). Fanionul de descriptor de fiier close-on-exec poate fi utilizat pentru a se asigura ca un descriptor de fiier este inchis automat in urma unui execve(2) reuit; consultai fcntl(2) pentru detalii. Procesele cu mai multe fire de execuie i close() Probabil ca nu este inelept sa inchidei descriptorii de fiier in timp ce acetia pot fi utilizai de apeluri de sistem in alte fire de execuie din acelai proces. Deoarece un descriptor de fiier poate fi reutilizat, exista unele condiii de concurena ascunse care pot provoca efecte secundare neintenionate. In plus, luai in considerare urmatorul scenariu in care doua fire efectueaza operaii pe acelai descriptor de fiier: (1) Un fir este blocat intr-un apel de sistem I/O pe descriptorul de fiier. De exemplu, incearca sa efectueze write(2) pe o conducta care este deja plina sau incearca sa efectueze read(2) de la un soclu de flux care nu are in prezent date disponibile. (2) Un alt fir inchide descriptorul de fiier. Comportamentul in aceasta situaie variaza de la un sistem la altul. Pe unele sisteme, atunci cand descriptorul de fiier este inchis, apelul de sistem blocant returneaza imediat cu o eroare. Pe Linux (i posibil pe alte sisteme), comportamentul este diferit: apelul de sistem I/O blocant deine o referina la descrierea fiierului deschis, iar aceasta referina menine descrierea deschisa pana la finalizarea apelului de sistem I/O. (Consultai open(2) pentru o discuie despre descrierile de fiiere deschise). Astfel, apelul de sistem blocant din primul fir poate fi finalizat cu succes dupa efectuarea close() din al doilea fir. Gestionarea raspunsurilor eronate de la close() Un programator atent va verifica valoarea de returnare a close(), deoarece este foarte posibil ca erorile de la o operaie anterioara write(2) sa fie raportate numai la close() final care elibereaza descrierea fiierului deschis. Ne verificarea valorii de returnare la inchiderea unui fiier poate duce la pierderea silenioasa de date. Acest lucru poate fi observat in special cu NFS i cu cota de disc. Reinei, totui, ca o returnare in caz de eec ar trebui utilizata numai in scopuri de diagnosticare (de exemplu, un avertisment adresat aplicaiei ca este posibil sa mai existe operaii I/O in ateptare sau ca este posibil sa fi existat operaii I/O euate) sau in scopuri de remediere (de exemplu, scrierea fiierului inca o data sau crearea unei copii de rezerva). Reincercarea operaiei close() dupa un eec este un lucru greit de facut, deoarece acest lucru poate cauza inchiderea unui descriptor de fiier reutilizat de la un alt fir de execuie. Acest lucru se poate intampla deoarece nucleul Linux elibereaza intotdeauna descriptorul de fiier la inceputul operaiei de inchidere, eliberandu-l pentru reutilizare; paii care pot returna o eroare, cum ar fi trimiterea datelor catre sistemul de fiiere sau dispozitiv, au loc doar mai tarziu in operaia de inchidere. In mod similar, multe alte implementari inchid intotdeauna descriptorul de fiier (cu excepia cazului EBADF, ceea ce inseamna ca descriptorul de fiier a fost nevalid) chiar daca ulterior raporteaza o eroare la returnarea de la operaia close(). In prezent, POSIX.1 nu se refera la acest aspect, dar exista planuri de a impune acest comportament in urmatoarea versiune majora a standardului. Un programator atent care dorete sa tie despre erorile I/O poate precede close() cu un apel la fsync(2). Eroarea EINTR este un caz oarecum special. In ceea ce privete eroarea EINTR, POSIX.1-2008 spune: Daca close() este intrerupt de un semnal care trebuie captat, acesta returneaza -1 cu errno configurata la EINTR i starea lui fildes este nespecificata. Acest lucru permite comportamentul care apare pe Linux i in multe alte implementari, unde, ca i in cazul altor erori care pot fi raportate de close(), descriptorul de fiier este garantat a fi inchis. Cu toate acestea, aceasta permite i o alta posibilitate: ca implementarea sa returneze o eroare EINTR i sa menina descriptorul de fiier deschis. Conform documentaiei sale, close() de la HP-UX face acest lucru. Apelantul trebuie apoi sa utilizeze inca o data close() pentru a inchide descriptorul de fiier, pentru a evita scurgerile de informaii din descriptorul de fiier. Aceasta divergena in comportamentele de implementare reprezinta un obstacol dificil pentru aplicaiile portabile, deoarece in multe implementari, close() nu trebuie sa fie apelat din nou dupa o eroare EINTR, iar in cel puin una, close() trebuie sa fie apelat din nou. Exista planuri de rezolvare a acestei enigme pentru urmatoarea versiune majora a standardului POSIX.1. CONSULTAI I close_range(2), fcntl(2), fsync(2), open(2), shutdown(2), unlink(2), fclose(3) 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 close(2)