Ce face os.lockf()
lockf() pune, verifică sau scoate un blocaj pe o porțiune a fișierului, de la poziția curentă, pe lungime octeți (0 = până la final). Comenzile sunt F_LOCK (blochează, așteptând dacă e nevoie), F_TLOCK (încearcă, fără așteptare), F_TEST (verifică) și F_ULOCK (deblochează). Blocajele sunt „consultative”: funcționează doar între programe care le respectă.
Parametri
| Parametru | Descriere |
|---|---|
fd |
Descriptorul (deschis pentru scriere). |
comanda |
F_LOCK, F_TLOCK, F_TEST, F_ULOCK. |
lungime |
Numărul de octeți blocați. |
Ce returnează
None.
Exemple
Exemplul 1: O singură instanță a programului
import os
fd = os.open("app.lock", os.O_RDWR | os.O_CREAT)
os.lockf(fd, os.F_TLOCK, 0)
print("Am obținut blocajul", flush=True)
pid = os.fork()
if pid == 0:
fd2 = os.open("app.lock", os.O_RDWR)
try:
os.lockf(fd2, os.F_TLOCK, 0)
except OSError:
print("Copilul: altă instanță rulează", flush=True)
os._exit(0)
os.waitpid(pid, 0)
os.lockf(fd, os.F_ULOCK, 0)
os.close(fd)
Rezultat
Am obținut blocajul
Copilul: altă instanță rulează
Greșeli frecvente
- Te aștepți ca blocajul să oprească orice program să scrie în fișier. Programele care nu apelează
lockfîl ignoră.
Comenzi înrudite
os.open(), read(), write(), lseek(), close(), closerange(): Lucrul de nivel jos cu fișierele, prin descriptori numerici, ca în C.os.fork() și os.register_at_fork(): Creează o copie a procesului curent; ambele continuă de la același rând.