Newsgroup: it.comp.lang.perl
Titolo: Flock(): necessario o no??

E' da un po' che mi pongo questa domanda relativa alla funzione flock():
è necessaria sui sistemi che supportano direttamente il locking dei
file?
Ad esempio, se scrivo uno script (puro perl o CGI) su una macchina Unix
che accede pesantemente e ripetutamente in scrittura su un file (anche
simultaneamente) è necessario applicare flock() in scrittura a tale
file?
O posso semplicemente ometterlo lasciando al sistema l'onere di impedire
accessi simultanei al file, che potrebbero corromperlo?
Grazie!
Ciao
M.
-- 
____________________________________________________
    Life's just a blast, it's moving realy fast    
better stay on top or life will kick you in the ass.
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

accessi simultanei al file, che potrebbero corromperlo?
A meno che venga usato l'equivalente di O_APPEND il sistema non fa nulla
di simile.
-- 
ciao, | * The Internet is full. Go away.  -- Joel Furr *
Marco | (Ri)scoprire fidonet: 
http://bbs.mi.linux.it

 di simile.
O_APPEND? 
Non sapendo minimamente cosa sia (btw, cos'č?), suppongo che in un
normale script non venga applicato il lock! Quindi, e qui si chiude il
cerchio, per ogni file che apro devo implementare un minimo di locking!
Corretto?
Ciao
M.
-- 
____________________________________________________
    Life's just a blast, it's moving realy fast    
better stay on top or life will kick you in the ass.
ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ

O_APPEND? 
man 2 open
Vedo (con strace) che e` implicito in open(HANDLE, ">>..."), quindi se
il tuo programma scrive atomicamente (con una sola funzione print) non
dovrebbero esserci problemi.


 dovrebbero esserci problemi.
Ma la print non e' di solito non-atomica? Credo che le uniche funzioni
atomiche siano sysread e syswrite.
print dipende da $| e infatti di solito e' bufferizzata.
Credo che la sezione 'File Locking' di perlopentut possa anche essere d'aiuto.
Maurizio
-- 
Maurizio M. Munafo' / 
mmmu...@netscape.net
"Consider Phlebas, who was once handsome and tall as you" (T.S.Eliot)

print dipende da $| e infatti di solito e' bufferizzata.
Si se non sett $| diversa da 0 il printing e' sempre bufferizzato.
I dati vengono scritti alla chiusura dell'handler o ogni (credo) Kb.
Mi salta in testa una domanda... e' possibile cambiare questa dimensione del
buffer qualunque esse sia per default? E' una cosa che non mi sono mai
chiesto.... adro' a sfogliare il cammello :)))
-- 
Saluti,
Giancarlo

 wrote:
: Ma la print non e' di solito non-atomica? Credo che le uniche funzioni
: atomiche siano sysread e syswrite.
: print dipende da $| e infatti di solito e' bufferizzata.
Direi che queste sono due cose distinte.
Un conto e` dire che c'e` un flush immediato, un conto e` dire che
l'operazione e` atomica. Potremmo avere una serie di operazioni di write
bufferizzate, ma sicuramente il sistema che inizia una specifica print
non la ferma a meta`.
ciao, .mau.

 dovrebbero esserci problemi.
Beh, meglio utilizzare il flock e via i problemi!
Grazie per i chiarimenti!

¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

buffer qualunque esse sia per default? E' una cosa che non mi sono mai
Non banalmente, perche` il buffer e` interno alla libc.


print dipende da $| e infatti di solito e' bufferizzata.
Anche se a livello di perl e` bufferizzata, alla fine sotto c'e` sempre
write(2) e quindi se si riesce a fare tutto con una unica write(2)
l'append rimane atomico.


Non banalmente, perche` il buffer e` interno alla libc.
Quindi e' architettura-dipedentente.
.. Non ho mai ricompilato la libc... potrebbe essere una "scusa" per farlo
:))) ....
-- 
Saluti,
Giancarlo

 Grazie!


 come realizzarlo?
A me risulta invece che sia il contrario, Windows (Win32) ha una funzione di
file locking,
mentre Unix no.....

 cerchero` un'altra donna dentro ai sogni di Tarzan...

mentre Unix no.....
Effettivamente unix ne ha almeno cinque: flock, fcntl, lockf, mandatory
locking in stile SysV, dotlocking.


Salve,
	ho delle librerie che fanno un lock dei file senza Flosk()
[hehe]
se volete le posto per discuterne.
DOMANDA:
come faccio a sapere se il sistema che mi ospita ha la possibilita' di
usare flock() ?
bye
Enrico

 usare flock() ?
use Fcntl ':flock' or die "Non c'e` proprio";
open FH, ...;
flock FH, LOCK_EX or die 'Non funge, qui';


 eval.
Mi auto correggo: non sembrerebbe esserci bisogno dell'eval. 
Quello che avevo visto fare era controllare $^O per vedere se il S.O. era
Windows (al che era sicuro che flock non c'era)


 flock FH, LOCK_EX or die 'Non funge, qui';
Dovrei verificare nel newsgroup americano, ma sembra che se flock non c'e'
dia un errore run-time, per cui il die non ti salva: dovresti provare in un
eval.
Maurizio


 Windows (al che era sicuro che flock non c'era)
Su NT dovrebbe funzionare, però, stando a quanto domcumentato in perlport.
Max