Slobodni_Seksu, da si malo guglao okolo sigurno bi nasao nacin koji
koriste programeri da naprave portabilno zakljucavanje fajlova. Sistem
se sastoji u sledecem:
"atomicno" se kreira fajl koji se zove (prema konvenciji) zove ISTO kao
fajl sa kojim zelis da "baratas", s tim da ima ekstenziju .lck sledecim
kodom:
Code:
#include <fcntl.h> // open()
#include <errno.h> // errno()
#include <stdio.h> // perror()
int fd;
fd=open("mojfajl.lck", O_WRONLY | O_CREAT | O_EXCL);
Odmah da napomenem da je ovo O_EXCL najbitnije od svega, i to zapravo
znaci ono "atomicno kreiranje" koje sam spomenuo na pocetku. Radi se o
tome da NE ZELIMO da nam neki drugi proces u toku samog procesa
otvaranja uleti i otvori mojfajl.lck! :) Dakle, zbog konkurencije...
Nakon ovoga moramo proverimo status fd-a i tu imamo tri slucaja:
1) fd<0 && errno==EEXIST - drugi proces je zakljucao fajl (zapravo je
kreirao mojfajl.lck , treba samo malo sacekati i pokusati ponovo "doci
do kljuca"):)
2) fd<0 - neka greska se desila prilikom kreiranja fajla (ne moze se
nastaviti sa radom)
3) u svakom drugom slucaju mi smo uspeli da otvorimo mojfajl.lck i na
taj nacin cemo "zakljucati" mojfajl.EXT, gde je EXT neka ekstenzija -
ovo je zapravo fajl sa kojim se radi u aplikaciji.
Kada se odradi posao koji treba sa mojfajl.EXT (nesto se upise, iscita,
obrise, ...), onda treba OBRISATI mojfajl.lck, cime se mojfajl.EXT
"otkljucava".
Za ovaj sistem potrebno je da svi procesi koji rade sa mojfajl.EXT budu
"nauceni" o svemu gore navedenom.
Pozdrav
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin