Faptele omului (2) setează sau elimină blocarea consultativă

Setează sau elimină o blocare consultativă pe un fișier deschis specificat în fd. Argumentul de operare poate conține una dintre următoarele valori: LOCK_SH Setați o blocare partajată. O blocare generală a unui fișier dat poate conține mai multe procese. LOCK_EX Instalați blocarea exclusivă. Numai un singur proces poate deține o blocare exclusivă a fișierelor. LOCK_UN Ștergeți o blocare existentă deținută de acest proces.

Apelul tur () poate fi blocat dacă un tip de blocare incompatibil este deja ținut de un alt proces. Pentru a efectua o interogare nonblocking, adăugați LOCK_NB (prin operația OR) la una dintre valorile descrise mai sus.

Un fișier nu poate avea simultan o blocare generală și exclusivă.

Blocurile create de flock () sunt asociate cu descriptorul de fișiere deschis (a se vedea deschis (2)). Acest lucru înseamnă că descriptorii de fișier duplicat (prin, de exemplu, apel furcă (2) sau DUP (2)) indică o blocare, iar această blocare pot fi modificate sau eliminate prin utilizarea oricare dintre acești descriptori de fișier. De asemenea, dispozitivul de blocare este eliberat, fie printr-o operație LOCK_UN explicită pe unul dintre descriptori de fișier duplicat, sau atunci când toate aceste descriptori de fișiere sunt închise.

Dacă procesul utilizează un apel deschis deschis (2) (sau un apel similar) pentru a obține mai mult de un descriptor de fișier în același fișier, atunci acești descriptori de fișiere sunt considerați independenți în flock (). O încercare de a bloca un fișier utilizând unul dintre acești descriptori de fișiere poate fi împiedicată datorită blocării că procesul de apelare a fost deja instalat printr-un alt descriptor de fișiere.

Procesul poate menține pe fișier numai unul dintre tipurile de blocare (generală sau exclusivă). Apelurile ulterioare la flock () pe un fișier deja blocat vor transforma blocarea curentă într-un nou mod de blocare.

Blocurile create de flock () sunt salvate la execve execve (2).

O blocare partajată sau exclusivă poate fi instalată în fișier, indiferent de modul în care fișierul a fost deschis.

RETURN VALUE

La reușită, este returnat 0. La eroare, -1 este returnat, iar errno este setat la valoarea corespunzătoare.

EBADFfd nu este un descriptor de fișiere deschis. EINTR Când așteptați ca blocarea să fie recepționată, apelul a fost întrerupt de un semnal care a venit la handler; vezi semnalul (7). EINVAL Operația este nevalidă. ENOLCK Kernel-ul nu avea suficientă memorie pentru a crea o înregistrare de blocare. EWOULDBLOCK Fișierul este blocat și sa specificat semnalul LOCK_NB.

CONFORME CU STANDARDELE

4.4BSD (pentru prima dată apelul tur () a apărut în 4.2BSD). Apelul () se află pe cele mai multe sisteme UNIX, eventual implementate cu fcntl (2).

Deoarece nucleu 2.0, efectiv () este implementat ca un apel de sistem independent, și nu ca emulația în biblioteca GNU C folosind fcntl (2). În această implementare nu există nici o interacțiune între tipurile de blocare efectiv plasate () și fcntl (2) și efectiv () nu detectează impasurilor (rețineți că, în unele sisteme, cum ar fi BSD moderne, solicită turmă () și fcntl (2 ), atunci când interacționează unul cu celălalt).

În kernel-urile Linux până la versiunea 2.6.11, flock () nu blochează fișierele de către NFS (adică acoperirea de blocare este limitată la sistemul local). În schimb, puteți utiliza blocarea regiunii fcntl (2), care funcționează pe NFS, dar este disponibilă într-o versiune mult mai nouă a Linux-ului, iar serverul trebuie să susțină și blocarea. Începând cu Linux 2.6.12, clienții NFS acceptă blocarea flock () prin emularea acestora prin blocarea regiunii octeților pentru întregul fișier. Acest lucru înseamnă că blocările fcntl (2) și turma () comunică între ele prin intermediul NFS. Începând cu Linux 2.6.37, kernelul acceptă modul de compatibilitate, care vă permite să citiți flock () de blocare (precum și blochează regiunea byte fcntl (2)) local; consultați descrierea parametrului local_lock în nfs (5).

flock () stabilește numai încuietori consultative; care au drepturile corespunzătoare asupra fișierului, procesul poate ignora utilizarea flock () și poate executa o operație I / O în fișier.

flock () și fcntl (2) au semantici diferite pentru procesele generate și dup (2). Pe sistemele în care flock () este implementat utilizând fcntl (2), semantica flock () va fi diferită de cea descrisă în această pagină de ajutor.

Când convertiți un blocaj (general la exclusiv sau invers), atomicitatea operației nu este garantată: mai întâi, blocarea existentă este ștersă și apoi este instalată o nouă. Între aceste două acțiuni, un alt proces care așteaptă cererea de blocare poate obține permisiunea, rezultând că conversia este fie blocată, fie că nu reușește dacă sa specificat semnalul LOCK_NB. (Acest comportament BSD original apare în multe alte implementări.)