PDA

View Full Version : [c++] lock su file


nuovoUtente86
07-06-2008, 16:18
Devo fare un programmino che va a lavorare su alcuni client(sia win che linux) in rete su file condivisi. Quello che occorre è che quando un' istanza del programma ha acquisito un file in scrittura gli altri ne possono acquisire solo la lettura...come avviene per office sostanzialmente.
Devo gestire il lock manualmente oppure il sistema lo fa aggratis..(non vorrei dire una cazzata ma mi pare di ricordare che windows acquisendo la scrittura attivi per gli altri la sola lettura)...su linux non so..

71104
08-06-2008, 10:41
Linux da questo punto di vista è un po' un escremento: è possibile anche cancellare un file aperto da un processo o addirittura un programma in esecuzione. su Windows basta che regoli i parametri della CreateFile: per limitare i permessi di condivisione alla lettura specifica FILE_SHARE_READ, per impedire anche la lettura non specificare niente; comunque è sufficiente che eviti di specificare FILE_SHARE_WRITE e FILE_SHARE_DELETE.

nuovoUtente86
08-06-2008, 11:58
quini su linux, devo provvedere da me a proteggere gli accessi conocorrenti alla risorsa?

wizard1993
08-06-2008, 12:00
quini su linux, devo provvedere da me a proteggere gli accessi conocorrenti alla risorsa?

direi proprio di si

71104
08-06-2008, 13:03
quini su linux, devo provvedere da me a proteggere gli accessi conocorrenti alla risorsa? e come faresti scusa? :D

se non si può non si può; è su Windows che devi provvedere tu (passando i flag giusti al terzo parametro della CreateFile), su Linux ti attacchi :Prrr:

arara
08-06-2008, 13:33
su Linux ci sarebbe una sorta di mandatory locking:
http://enpc3240.eas.asu.edu/lxr/linux/http/source/Documentation/mandatory.txt

nuovoUtente86
08-06-2008, 15:44
e come faresti scusa? :D

se non si può non si può; è su Windows che devi provvedere tu (passando i flag giusti al terzo parametro della CreateFile), su Linux ti attacchi :Prrr:

è possibile in linux controllare se un file è già in uso?

71104
08-06-2008, 16:43
è possibile in linux controllare se un file è già in uso? non che mi risulti...

nuovoUtente86
08-06-2008, 16:53
non che mi risulti...

xkè se fosse possibile, mi basterebbe regolare le azioni del processo in base all' esito del controllo..

71104
08-06-2008, 17:21
xkè se fosse possibile, mi basterebbe regolare le azioni del processo in base all' esito del controllo..
se ti va bene che gli altri programmi possano scrivere sul file e che solo il tuo lavori sul lock allora basta che usi tecniche di sincronizzazione; ma anche là ci sono un sacco di problemi perché su Linux due processi possono usare lo stesso semaforo solo se uno è padre dell'altro, altrimenti devi usare una FIFO e realizzare su di essa un protocollo di sincronizzazione (e giù di pippe mentali sulle operazioni atomiche e non).

guarda se puoi usare le features descritte nel link postato da arara, che mi pare di capire che siano le analoghe di LockFile (http://msdn.microsoft.com/en-us/library/aa365202.aspx); non credo che questo sistema però impedisca la cancellazione.

nuovoUtente86
08-06-2008, 17:39
se ti va bene che gli altri programmi possano scrivere sul file e che solo il tuo lavori sul lock allora basta che usi tecniche di sincronizzazione; ma anche là ci sono un sacco di problemi perché su Linux due processi possono usare lo stesso semaforo solo se uno è padre dell'altro, altrimenti devi usare una FIFO e realizzare su di essa un protocollo di sincronizzazione (e giù di pippe mentali sulle operazioni atomiche e non).

guarda se puoi usare le features descritte nel link postato da arara, che mi pare di capire che siano le analoghe di LockFile (http://msdn.microsoft.com/en-us/library/aa365202.aspx); non credo che questo sistema però impedisca la cancellazione.

I file sarebbero dedicati solo per quel programmi quindi il problema di modifiche esterne sarabbe minimo.
Avevo inizialmente pensato proprio ad un sistema protetto con monitor, ma come giustamente dicevi bisogna sbattersi molto per realizzarlo...Inoltre considera che le varie istanze del programma girerebbero su client diversi all' interno della rete lan...quindi credo che sarebbe in ogni caso impossibile sincronizzarli con dei semafori(almeno credo).

71104
08-06-2008, 18:40
I file sarebbero dedicati solo per quel programmi quindi il problema di modifiche esterne sarabbe minimo. se puoi trascurare il problema di interferenze esterne allora direi che puoi tranquillamente adoperare una soluzione basata su locking mandatorio su entrambe le piattaforme, la quale tra l'altro su Windows ti da' il vantaggio di poter attendere che un file venga sbloccato (vedi LockFileEx (http://msdn.microsoft.com/en-us/library/aa365203(VS.85).aspx)).

nuovoUtente86
08-06-2008, 19:02
se puoi trascurare il problema di interferenze esterne allora direi che puoi tranquillamente adoperare una soluzione basata su locking mandatorio su entrambe le piattaforme, la quale tra l'altro su Windows ti da' il vantaggio di poter attendere che un file venga sbloccato (vedi LockFileEx (http://msdn.microsoft.com/en-us/library/aa365203(VS.85).aspx)).

ma acquisendo il lock il file non viene destinato al solo chiamante ed escluso agli altri (quindi eventualmente altre istanze del programma ma ipoteticamente anche altri programmi) oppure funziona nel senso in cui nei metodi del mio programma, prima di utilizzare un file devo far acquisire il lock ma la risorsa resta esternamente libera?

ilsensine
09-06-2008, 11:12
71104 continua a presumere... :cool:
Linux da questo punto di vista è un po' un escremento: è possibile anche cancellare un file aperto da un processo o addirittura un programma in esecuzione.
Non cancellare, ma scollegare.
Un file non viene cancellato se lo "scolleghi", ma quando non ha più riferimenti (l'apertura di un file implica l'acquisizione di un riferimento; il nome sul file system è un "riferimento" come gli altri)

su Windows basta che regoli i parametri della CreateFile: per limitare i permessi di condivisione alla lettura specifica FILE_SHARE_READ, per impedire anche la lettura non specificare niente; comunque è sufficiente che eviti di specificare FILE_SHARE_WRITE e FILE_SHARE_DELETE.
Windows ha di comodo la possibilità di specificare il lock all'atto dell'apertura del file

se non si può non si può; è su Windows che devi provvedere tu (passando i flag giusti al terzo parametro della CreateFile), su Linux ti attacchi :Prrr:
Ite missa est... :stordita:

se puoi trascurare il problema di interferenze esterne allora direi che puoi tranquillamente adoperare una soluzione basata su locking mandatorio su entrambe le piattaforme, la quale tra l'altro su Windows ti da' il vantaggio di poter attendere che un file venga sbloccato (vedi LockFileEx (http://msdn.microsoft.com/en-us/library/aa365203(VS.85).aspx)).
fcntl(F_SETLKW)

su Linux due processi possono usare lo stesso semaforo solo se uno è padre dell'altro
Dove avresti letto una castroneria simile?

è possibile in linux controllare se un file è già in uso?
fuser riporta gli utilizzatori di un file, ma nel tuo caso sarebbe meglio usare i lock -- se non ricordo male samba emula i lock di windows con gli advisory lock di linux. Se il tuo problema è gestire i lock tra le macchine windows _e_ le macchine linux, dovresti fare così.

nuovoUtente86
09-06-2008, 11:24
infatti il questito che mi ponevo e': se un client windows ha aperto un file, come gli sincronizza una richiesta di accesso allo stesso file da un client linux?

ilsensine
09-06-2008, 11:32
infatti il questito che mi ponevo e': se un client windows ha aperto un file, come gli sincronizza una richiesta di accesso allo stesso file da un client linux?
Di default samba dovrebbe usare gli advisory lock, quindi un client linux può interagire con la stessa tecnica se opera direttamente sul file system.
Nota che per i programmi che non usano i lock, puoi usare l'utility flock (v. man flock) per effettuare il lock in loro vece.

nuovoUtente86
09-06-2008, 13:55
La situazione che potrebbe verificarsi è questa:

-Il file risiede su una macchina windows(ma potrebbe essere linux)
-Un client Linux accede dalla Lan al file e dovrebbe acquisirne tutti i privileggi in quanto la risorsa è libera.
-Un client windows accede al file, ma ora dovrebbe essere limitato alla sola lettura....

Come sfrutto i lock per fare ciò...avendo sistemi diversi e la lan di mezzo.?

ilsensine
09-06-2008, 14:15
-Un client Linux accede dalla Lan al file e dovrebbe acquisirne tutti i privileggi in quanto la risorsa è libera.
-Un client windows accede al file, ma ora dovrebbe essere limitato alla sola lettura....
Questi due punti non sono compatibili. Se un client ha pieni privilegi sul file, il secondo non può accedere, neanche in sola lettura.
Sotto linux si può aggirare questo limite se usi gli advisory lock (non i mandatory!) e ignori l'impossibilità di prendere il write lock. Ma sta al programma comportarsi così, ed è questionabile se è un comportamento corretto.

nuovoUtente86
09-06-2008, 14:22
Questi due punti non sono compatibili. Se un client ha pieni privilegi sul file, il secondo non può accedere, neanche in sola lettura.
Sotto linux si può aggirare questo limite se usi gli advisory lock (non i mandatory!) e ignori l'impossibilità di prendere il write lock. Ma sta al programma comportarsi così, ed è questionabile se è un comportamento corretto.

Scusa sotto linux...un processo non puo accedere ad un file anche se utilizzato da un altro processo?

ilsensine
09-06-2008, 14:35
Sì che può. Non puoi però mettere un wrlock su un file, e sperare di acquisirne contemporaneamente un rdlock. Da quello che descrivi, è questo che ti serve.
Qui windows è un pò più flessibile, ti consente di aprire un file in scrittura consentendo ulteriori aperture in lettura ma non in scrittura. Sotto linux questo richiede una maggiore cooperazione dei programmi.

nuovoUtente86
09-06-2008, 14:50
Sì che può. Non puoi però mettere un wrlock su un file, e sperare di acquisirne contemporaneamente un rdlock. Da quello che descrivi, è questo che ti serve.
Qui windows è un pò più flessibile, ti consente di aprire un file in scrittura consentendo ulteriori aperture in lettura ma non in scrittura. Sotto linux questo richiede una maggiore cooperazione dei programmi.

Si effettivamente hai ragione...(il ReadWriteLock di java insegna).....Quello che ancora non mi è affatto chiaro....è come "sincronizzare" la difformità tra i sistemi e il fatto che le risorse siano remote.

ilsensine
09-06-2008, 15:19
Samba provvede automaticamente a traslare i due tipi di lock. Riguardo linux, devi usare programmi che fanno uso degli advisory lock. OpenOffice è uno di questi ad esempio.

nuovoUtente86
09-06-2008, 15:30
. Riguardo linux, devi usare programmi che fanno uso degli advisory lock. OpenOffice è uno di questi ad esempio.
In che modo ? OpenOffice è un esempio di implementazione vuoi dire?

Samba si usa solo su linux?

ilsensine
09-06-2008, 15:39
Sì openoffice è uno dei programmi "scritti bene", che usano gli strumenti appropriati per l'accesso ai file.

Samba è lo strumento di condivisione file con il mondo Microsoft (è disponibile come server, per esportare degli share a computer windows, o come file system di rete - smbfs/cifs - per montare degli share di un samba server o di un server Windows).

nuovoUtente86
11-06-2008, 19:53
Sì openoffice è uno dei programmi "scritti bene", che usano gli strumenti appropriati per l'accesso ai file.

Samba è lo strumento di condivisione file con il mondo Microsoft (è disponibile come server, per esportare degli share a computer windows, o come file system di rete - smbfs/cifs - per montare degli share di un samba server o di un server Windows).

Ma open Office non è scritto in Java...i lock sono stati realizzati con chiamate native?

ilsensine
12-06-2008, 12:40
Non so come lo fa, ti ho riportato quello che ho osservato.
Se vuoi posso dirti come farlo in c++.