flock(2) System Calls Manual flock(2) NUME flock - aplica sau elimina o blocare consultativa pe un fiier deschis BIBLIOTECA Biblioteca C standard (libc, -lc) SINOPSIS #include int flock(int fd, int op); DESCRIERE Aplica sau elimina o blocare consultativa pe fiierul deschis specificat de fd. Argumentul op este unul dintre urmatoarele: LOCK_SH Plaseaza o blocare partajata. Mai mult de un proces poate deine o blocare partajata pentru un anumit fiier la un moment dat. LOCK_EX Plaseaza o blocare exclusiva. Un singur proces poate deine o blocare exclusiva pentru un anumit fiier la un moment dat. LOCK_UN Elimina o blocare existenta deinuta de acest proces. Un apel la flock() se poate bloca daca un alt proces deine o blocare incompatibila. Pentru a face o cerere neblocanta, includei LOCK_NB (printr-un SAU logic) cu oricare dintre operaiile de mai sus. Un singur fiier nu poate avea simultan blocaje partajate i exclusive. Blocajele create de flock() sunt asociate cu o descriere de fiier deschis (a se vedea open(2)). Aceasta inseamna ca descriptorii de fiier duplicai (creai, de exemplu, prin fork(2) sau dup(2)) se refera la acelai blocaj, iar acest blocaj poate fi modificat sau eliberat utilizand oricare dintre aceti descriptori de fiier. In plus, blocajul este eliberat fie printr-o operaie explicita LOCK_UN asupra oricaruia dintre aceti descriptori de fiier duplicat, fie atunci cand toi aceti descriptori de fiier au fost inchii. Daca un proces utilizeaza open(2) (sau similar) pentru a obine mai mult de un descriptor de fiier pentru acelai fiier, aceti descriptori de fiier sunt tratai independent de flock(). O incercare de blocare a fiierului folosind unul dintre aceti descriptori de fiier poate fi refuzata de o blocare pe care procesul apelant a plasat-o deja printr-un alt descriptor de fiier. Un proces poate deine un singur tip de blocare (partajata sau exclusiva) pe un fiier. Apelurile ulterioare flock() pe un fiier deja blocat vor converti un blocaj existent in noul mod de blocare. Blocajele create de flock() sunt pastrate in timpul unui execve(2). O blocare partajata sau exclusiva poate fi plasata pe un fiier indiferent de modul in care a fost deschis fiierul. VALOAREA RETURNATA In caz de succes, se returneaza zero. In caz de eroare, se returneaza -1, iar errno este configurata pentru a indica eroarea. ERORI-IEIRE EBADF fd nu este un descriptor de fiier deschis. EINTR In timp ce atepta sa obina un blocaj, apelul a fost intrerupt de livrarea unui semnal capturat de un gestionar; a se vedea signal(7). EINVAL op nu este valid. ENOLCK Nucleul a ramas fara memorie pentru alocarea inregistrarilor de blocare. EWOULDBLOCK Fiierul este blocat i fanionul LOCK_NB a fost selectat. VERSIUNI Incepand cu Linux 2.0, flock() este implementat ca un apel de sistem de sine statator in loc sa fie emulat in biblioteca GNU C ca un apel catre fcntl(2). Cu aceasta implementare, nu exista nicio interaciune intre tipurile de blocare plasate de flock() i fcntl(2), iar flock() nu detecteaza blocajul. Reinei, totui, ca pe unele sisteme, cum ar fi BSD-urile moderne, blocajele flock() i fcntl(2) interacioneaza intre ele. Detalii privind CIFS Pana la Linux 5.4, flock() nu este propagat prin SMB. Un fiier cu astfel de blocaje nu va aparea blocat pentru clienii de la distana. Incepand cu Linux 5.5, blocajele flock() sunt emulate cu blocari ale intervalului de octei SMB pe intregul fiier. In mod similar cu NFS, aceasta inseamna ca blocajele fcntl(2) i flock() interacioneaza intre ele. Un alt efect secundar important este ca blocajele nu mai sunt consultative: orice IO pe un fiier blocat va eua intotdeauna cu EACCES atunci cand este efectuata de la un descriptor de fiier separat. Aceasta diferena provine din proiectarea blocajelor in protocolul SMB, care ofera o semantica de blocare obligatorie. Semantica blocarii la distana i obligatorii poate varia in funcie de protocolul SMB, opiunile de montare i tipul de server. Consultai mount.cifs(8) pentru informaii suplimentare. STANDARDE BSD. ISTORIC 4.4BSD (apelul flock() a aparut pentru prima data in 4.2BSD). O versiune a flock(), eventual implementata in termeni de fcntl(2), apare pe majoritatea sistemelor UNIX. Detalii privind NFS Pana la Linux 2.6.11, flock() nu bloca fiiere prin NFS (adica, domeniul de aplicare al blocajelor era limitat la sistemul local). In schimb, se poate utiliza blocarea intervalului de octei fcntl(2), care funcioneaza pe NFS, avand in vedere o versiune suficient de recenta de Linux i un server care accepta blocarea. Incepand cu Linux 2.6.12, clienii NFS accepta blocajele flock() prin emularea lor ca blocari de interval de octei fcntl(2) pe intregul fiier. Aceasta inseamna ca blocajele fcntl(2) i flock() do interacioneaza intre ele pe NFS. Aceasta inseamna, de asemenea, ca pentru a plasa o blocare exclusiva, fiierul trebuie sa fie deschis pentru scriere. Incepand cu Linux 2.6.37, nucleul accepta un mod de compatibilitate care permite ca blocajele flock() (i, de asemenea, blocajele regiunii de octei fcntl(2)) sa fie tratate ca locale; a se vedea discuia despre opiunea local_lock din nfs(5). NOTE flock() plaseaza numai blocaje consultative; avand in vedere permisiunile adecvate asupra unui fiier, un proces este liber sa ignore utilizarea flock() i sa efectueze I/O asupra fiierului. Blocajele flock() i fcntl(2) au semantici diferite cu privire la procesele bifurcate i dup(2). Pe sistemele care implementeaza flock() folosind fcntl(2), semantica lui flock() va fi diferita de cea descrisa in aceasta pagina de manual. Conversia unui blocaj (partajat in exclusiv sau viceversa) nu este garantata ca fiind atomica: blocajul existent este mai intai eliminat, iar apoi se stabilete un nou blocaj. Intre aceti doi pai, o cerere de blocare in ateptare din partea unui alt proces poate fi acordata, rezultatul fiind fie blocarea conversiei, fie eecul acesteia daca a fost specificat LOCK_NB; (acesta este comportamentul BSD original i apare in multe alte implementari.) CONSULTAI I flock(1), close(2), dup(2), execve(2), fcntl(2), fork(2), open(2), lockf(3), lslocks(8) Documentation/filesystems/locks.txt in arborele sursa al nucleului Linux (Documentation/locks.txt in nucleele mai vechi) 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 flock(2)