DrDoogie Skrevet 10. desember 2003 Del Skrevet 10. desember 2003 (endret) 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 10. desember 2003 av DrDoogie Lenke til kommentar
Jazzcat Skrevet 10. desember 2003 Del Skrevet 10. desember 2003 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
DrDoogie Skrevet 11. desember 2003 Forfatter Del Skrevet 11. desember 2003 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
xeon Skrevet 11. desember 2003 Del Skrevet 11. desember 2003 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
kattemat Skrevet 11. desember 2003 Del Skrevet 11. desember 2003 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
iDude Skrevet 11. desember 2003 Del Skrevet 11. desember 2003 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
DrDoogie Skrevet 11. desember 2003 Forfatter Del Skrevet 11. desember 2003 (endret) 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. Endret 11. desember 2003 av DrDoogie Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå