Gå til innhold

Teit spørsmål om låsing av fil


Anbefalte innlegg

Jeg har da to script, ett som skriver til en fil tilnærmet konstant (buffra, men bufferet har jeg ikke justert størrelsen på, så i praksis blir det skrevet hele tida), og ett som av og til leser ifra den.

 

Tanken er da at jeg skal kunne bruke fila som en fifo - skrive til enden, lese litt fra begynnelse. Og da seff uten at scriptet som leser skal være tvunget til å bære ansvaret med å skrive hele resten av fila om igjen, ei heller stoppe scriptet som skriver og begynne å rote noe hemningsløst med semaphorer og annet komplifnesrende tøv.

 

'mknod happyhappyjoyjoy p' er ubrukelig, da det krever en leser for at skrivinga skal komme igang. Socket er ubrukelig all den tid jeg ikke har 10GiB med minne.

 

Foreløpig har jeg fikset dette med en funksjon som tester om fila har kommet over en viss størrelse, og begynner på en ny fil hvis så er tilfellet. Men dette er jo utilstrekkelig for de tilfeller hvor fila ikke kommer over størrelsen (ok, ny fil hver 'N' timer, men likefullt).

 

Forslag til hvordan jeg kan fikse dette med noe artige greier i linux?

Endret av DrDoogie
Lenke til kommentar
Videoannonse
Annonse

Hva med å lage dette i C med systemkall ?

 

fd=open(filename, flag);

 

flag:

O_RDONLY Åpne kun for lesing

O_WRONLY kun for skriving

O_RDWR Skrive og lese

O_APPEND filepointer til slutten av filen (append)

..etc

 

Flytte seg i filen med lseek()

lseek(fd, offset, flag)

flag:

SEEK_SET relativt til start av fil

SEKK_CUR relativt til nåværende posisjon

SEEK_END relativt til slutten av filen

 

For å låsing:

 

lockf(fd, flag, off_t len)

Del av filen:off_t = pos..pos+len-1

 

F_LOCK Låse del av filen

F_ULOCK Låse opp del av filen

F_TEST tester om delen av filen er låst

etc..

 

Litt kompisert men da har du ihvertfall full kontroll. ;)

Lenke til kommentar

Javel?

 

Akkuratt nå bruker jeg jo 'flock' i perl da, som forteller meg at jeg kun kan mekke en "advisory exclusive" lock på fila.

 

Jeg kan med andre ord fint åpne fila i eksempelvis vim, og herje og ballére vilt.

 

Men du sier altså at det å slenge opp en POSIX lås er veien å gå?

 

Det er vel en grei sak, men disse to skriptene kommuniserer ikke. Og jeg kan ikke ha noe av at leseren blokker skriveren, eller at leseren venter på skriveren.

 

En tanke som faller inn i hodet på meg, er om jeg kan lage en fil som en sirkulær kø, og bare si at den er 100MiB eller noe.

 

Er jeg på viddene?

Lenke til kommentar

En måte å låse en fil er å lage en annen fil under f.eks. /var/lock som forteller at et annet program trenger exclusive lock på den og den filen.. f.eks

 

script#1:

 

if [ ! -f /var/lock/cewl.lock ]; then

touch /var/lock/cewl.lock

fi

 

screipt#2:

 

if [ -f /var/lock/cewl.lock ]; then

echo "omfg!"; exit 9

fi

 

script#1:

# ferdig med exclusive lock:

rm -f /Var/lock/cewl.lock

Lenke til kommentar

Flock låser filen om du da (selvfølgelig) bruker den både hos komsumenten og produsenten. Men du bør vel ha en eler annen signalering...

Hva med å skrive til flere filer(fil.1, fil.2 osv) Når produsenten har skrevet si 1000 linjer oppretter den en ny fil. Når konsumenten kommer til enden av en fil sletter den filen og begynner å lese fra den neste.

Lenke til kommentar

Om du bruker perl, så støtter det non-blocking io i fifo-filer (god norsk ja). Dvs perl skriver til fifo, og fortsetter i programmet selv om ingen andre rutiner har lest fra fifoen.

 

Det er os-avhengig, dog, men jeg tror linux støtter det. Sjekk "man 2 open" og let etter "O_NDELAY" eller "O_NONBLOCKING". Om denne rutinen stltter det, så skal "perl open" også støtte det (se "man perlopentut").

Lenke til kommentar
Om du bruker perl, så støtter det non-blocking io i fifo-filer (god norsk ja). Dvs perl skriver til fifo, og fortsetter i programmet selv om ingen andre rutiner har lest fra fifoen.

 

Det er os-avhengig, dog, men jeg tror linux støtter det. Sjekk "man 2 open" og let etter "O_NDELAY" eller "O_NONBLOCKING". Om denne rutinen stltter det, så skal "perl open" også støtte det (se "man perlopentut").

Ah, se det! Det må prøves!

 

...men hvordan foregår ting bak kulissene igrunn, når det blir skrevet til fifo'en? Si at det skrives 100Mib, hvor gjør disse dataene av seg? Teit spørsmål kanskje, men hvis 'skriveren' avslutter uten at det har blitt lest noe, vil da dataene ligge i fifo'en?

 

Vel, man er idiot når man spør, men spør man ikke så fortsetter man kun å være idiot.

 

OT:

@xeon: Artig subtil vits i avataren din... /me like. :lol:

Endret av DrDoogie
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...