Newsgroup: it.comp.lang.c
Titolo: Accesso a file - locking

Ciao,
parliamo di sistemi Unix, non so se su Win cambi qualcosa.
Io apro un file in scrittura con una fopen(); se un altro processo (non
thread) accede allo stesso file in scrittura, cosa succede? Riceve un
errore? E se l'altro processo non e' C/C++ ma Java?
Il problema di base, e' che ho 2 programmi, uno Java e uno C, che devono
accedere in scrittura allo stesso file, ma ovviamente sarebbe gradito che
se uno lo apre in scrittura, l'altro non puo' farlo. Cosa mi dite? Lo fa
automaticamente stdio, oppure devo usare un meccanismo di lock fatto
apposta tipo .nomefile.lock?
Grazie mille a tutti,
Pietro Femmino`


Ciao, first of all sorry, im spagnolo ma no se molto italiano:
in C, when you make fopen you have a file descriptor, that is, a pointer 
to some space inside the file managed by the operaqting system, you can 
made lots of fopen of the same file because they are independent on each 
other, both the position and the atributes of the file, so there is no 
problem with open one file including if you use several programs at the 
sime time.
Bye.

 ha scritto nel messaggio
news:O5C8c.592$9c.6...@news.ono.com...

IMHO this would be better if the files are open in read mode.
When the files are open in write mode the mechanism that you explained
doesn't work because all the program can modify the some file at the some
time.
For me is better to make provision for a semaphore to interlock the file
access in write mode.
Regards
Giuseppe

 problem with open one file including if you use several programs at the 
Hi, thanks :)
Ok, but what if program 'A' writes to the same file as program 'B' at the
same time? 
Thanks again :)
Pietro


Hi, talk to me in italian please XD, it is completly IMPOSSIBLE to write 
two things at the sime time, the operating sistem manage lots of cues 
but i have tried with c and the pointers are not updated so, if you have 
2 fd at the begginnig of the file and you write with each one, you will 
see the words overlapped. But I dont know what will happen with diferent 
programs.
Bye.


Devi usare un qualche tipo di file locking.
Non conosco sistemi di locking presenti nello ANSI C, per cui se vuoi
rendere portabile il tuo programma devi utilizzare un qualche sistema di
locking cooperativo, cioč che sia riconosciuto ed utilizzato da tutti quei
programmi (java,c,c++) che accedono al file stesso.
Se crei un locking cooperativo (come la creazione di un /tmp/file.lock) un
eventuale altra applicazione ignara di questo meccanismo potrŕ comunque
accedere al file.
Invece il POSIX ci da una mano con la system call fcntl() per creare locks
che non possono essere ignorati (mandatory locks), se il file system č
montato con l'opzione mand 'mount /dev/sdx -o mand'.
Dai uno sguardo a fcntl(), lockf() (che č un wrapper alla precedente).
Devi aprire i files da bloccare con open() e non con fopen() per potere
usare le chiamate precedenti.
La cosa interessante č che puoi bloccare anche solo regioni (da byte a byte)
del file che ti interessa.
 
Fabio
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

> parliamo di sistemi Unix[...]
it.comp.os.linux.development

 it.comp.os.linux.development
Il file locking e` estraneo al C? POSIX e` estraneo al C? Se devi lockare
un file sotto Windows come fai? Cosa ti fa presupporre che si parli di
Linux? Se fosse un BSD?
In questo gruppo si parla esclusivamente di cio` che per il C non e`
localizzato a una certa implementazione? (E, ripeto, non credo che il file
locking sia caratteristica di uni*. Si sarebbe potuto discutere anche di
"crea tu a mano un file di lock e gestisciti un meccanismo in questo
modo", cosa che mi sembra ben poco legata alla piattaforma).
Ciao, grazie lo stesso ;)

(E, ripeto, non credo che il file locking sia caratteristica di uni*.
E nessuno, difatti, ha mai detto questo.  Le tecniche con cui
"lockare" un file, perň, sono specifiche della piattaforma, quindi sei
pregato di rivolgerti ad altri gruppi.

 modo", cosa che mi sembra ben poco legata alla piattaforma).
Non credo che usando il C "puro" (quello che si discute principalmente
qui) tu possa creare a mano un file di lock.
Ti devi comunque appoggiare su una qualche caratteristica
del sistema operativo che garantisca l'accesso esclusivo.
Soprattutto se cerchi di fare la cosa da due linguaggi
diversi, e' ragionevole pensare che tu debba usare qualcosa che
trascende il linguaggio (e ricadiamo nel sistema operativo).
Per esempio sotto linux, (non so nel tuo Unix),
puoi usare (chiamadolo da programma con una system) il comando
lockfile, tipo
system("lockfile ciccio.lock");
seguito poi da un system("rm -rf ciccio.lock");
quando hai finito
Presumo che tu possa fare una cosa simile da Java,
e dovresti essere a posto.
ciao,
g.

 programs.
Questo, purtroppo, non e' vero nel caso in cui si usi la libreria
"C". Il "C" standard non fornisce nessun supporto per il locking,
infatti e' pensata per essere portabile anche su S.O. che non hanno
il supporto per la comunicazione tra processi o il concetto di processi
concorrenti.
Se si vuole consentire solo l'accesso in lettura ad un file aperto
in scrittura da un altro e' necessario usare le primitive di sistema.
open()
CreateFile()
...
oppure usare qualche tipo di locking cooperativo, anche se non e' molto
sicuro.
HTH
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG


Hi, it may be helpfull to you the command Lsof, it displays all open 
files on a UNIX system.
Bye.

 files on a UNIX system.
Move to a Unix-like group if you want to talk about that.
This group deals with the standard language.
Moreover, this is an Italian group, so please use Italian language.
Andrea Laforgia

 files on a UNIX system.
L'OP parlava di fopen() e fopen() e' indipendente da Unix.
Mediante fopen() NON e' possibile nessun tipo di lock.
La libreria "C" standard non ha nemmeno idea dell'esistenza di un
comando denominato  lsof (e in quasto NG si parla solo di "C"
standard") e un programma in "C" standard non usa risorse specifiche
di una certa implementazione/SO.
Esistono molte tecniche per regolare gli accessi concorrenti alle
risorse, ma nessuna (per quanto di mia conoscenza) prescinde dall'uso
di quanto messo a disposizione dal S.O. sottostante.
Per il locking dei file, l'unica tecnica implementabile usando solo
la libreria standard del "C" e' il cooperative locking ed e' _MOLTO_
inaffidabile.
Se l'OP e' interessato al locking su una piattaforma specifica, puo'
rivolgersi ad un NG specifico per quella piattaforma.
