[ Free_Sex @ 15.01.2004. 20:14 ] @
Dakle kako da osiguram da dok jedan skript pise u fajl drugi to ne moze ?

Na windowsu .... za *nix znam flock file,...

Provera tipa dali postoji fajl sa if(-e $fajl) pa ako ne postoji da ga krejiram ne znam bas kako ce da radi, jer moze da dodje do race conditions-a ?
[ leka @ 16.01.2004. 15:32 ] @
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
[ leka @ 16.01.2004. 18:26 ] @
Ja se zaista izvinjavam, nisam video uopste koja je ovo diskusija! :(
Ali, u principu je stvar slicna u bilo kom jeziku! :)
[ Free_Sex @ 17.01.2004. 11:24 ] @
Ma nema veze. Nesto sam nacuo za to ... doduse nizao znao da je to "konvencija".
A bogami je napisano i da nije bas tako sigurno od racing conditionsa ... ? Ali bolje ista nego nista. Nego posto je potrebno da jedan line izbacim iz fajla, to ustvari znaci da ucitam ceo fajl i da zatim zapisem opet sve ostale sem njega, a tu moze bas da se zezne. Ma kad nikako da namestim mysql kod mene na kompu da radi :(

A inace sto se tice C-a, ni to nije problem. Laslo Kraus je ipak u pitanju. Samo je PERL mnogo, mnogo lepsi za raditi u njemu :D
[ leka @ 18.01.2004. 17:45 ] @
Ako se u svim procesima koji treba da zakljucavaju/otkljucavaju
data-fajl pridrzavas gore recenog, onda neces doci do race condition-a
100%. Do race condition-a se moze doci i sa drugim, sigurnijim metodama.
Dakle, sve je do programera.

Ja ti nisam dao savrseno resenje, vec portabilno i jednostavno, koje
koristi dosta ljudi kad nemaju drugu alternativu.

Pozdrav :)
[ Free_Sex @ 20.01.2004. 12:09 ] @
Dobro to se podrazumeva da je potrebno da svi programi/procesi koji ce da pristupaju tom fajlu, se pridrzavaju tog pravila, kako bi sve to funkcionisao.

Ali nema veze, koliko sam skapirao, flock() funkcija ne radi samo na "slabijim" verzijama windowsa kao sto su 9x i me. Dok na NT i XP radi.

Cisto sumljam da bilogde u svetu imaju server sa 9x windowsom. Mislim web/mail server na kojem bi i izvrsavali moju skriptu.

U svakom slucaju hvala, mozda zatreba za nesto kad budem pisao u C-u ili slicno.
(mada i tamo treba da ima fcntl.h i flock funkcija ...)