|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6284
|
[C] Scrittura concorrente in file
Salve,
mi domandavo come fare per far scrivere contemporaneamente a più processi nello stesso file binario. Ho provato a dire ad ogni processo di scrivere nel file posizionando il puntatore con fseek, solo che ogni volta ovviamente il file viene sovrascritto dall'ultimo processo che arriva. Grazie. Ultima modifica di Unrue : 02-01-2007 alle 11:35. |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Mentre invece il problema esiste sicuramente per scritture contemporanee nello stesso punto. In ogni caso sarebbe meglio fare un lock del file (o di una parte del file, se è possibile), fare le modifiche, e poi togliere il lock. Comunque quando passa di qui qualcuno più esperto sull'argomento, saprà dirti sicuramente meglio.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: May 2004
Messaggi: 1136
|
Non consideratemi esperto, ma non si avrebbero problemi anche nella scrittura contemporanei in punti diversi per il fatto che non sarebbe più coerente la posizione?
Io avrei detto di usare i semafori, o comunque un qualsiasi strumento di mutua esclusione. |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6284
|
Quote:
|
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6284
|
Quote:
|
|
|
|
|
|
|
#6 | ||
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19148
|
esattamente come devono avvenire le scritture? devi posizionarti in un punto preciso o basta che tu scriva alla fine del file ogni volta?
|
|
|
|
|
|
#8 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
in Win32 esiste l'overlapped I/O, che supporta già da solo tutta la sincronizzazione necessaria a risolvere il problema.
EDIT - no scusate, non vorrei aver detto una boiata, controllo meglio... ![]() EDIT2 - boh, non è che sia esplicitato molto bene, ma mi pare di aver capito che se una lettura overlapped avviene contemporaneamente a una scrittura overlapped, i dati letti non sono "inconsistenti"; mentre se le due non operazioni fossero overlapped i dati letti potrebbero essere inconsistenti. Ultima modifica di 71104 : 02-01-2007 alle 16:07. |
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#10 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6284
|
Quote:
|
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6284
|
Ho scritto questo:
Codice:
void scrivi_file(float**matrice_trasposta_locale,int lx,int dim_mat,int me)
{
struct flock fl;
int fd;
off_t offset;
int ris;
fl.l_type= F_WRLCK; /* tipo di lock*/
fl.l_whence = SEEK_SET; /* offset */
fl.l_start = 0; /* Offset per l_whence */
fl.l_len = 0; /* length, 0 = to EOF */
fl.l_pid = getpid(); /* our PID */
fd = open("home/gabriele/Desktop/output", O_WRONLY); //fd è il Descrittore del file
fcntl(fd, F_SETLKW, &fl); // Attendi per avere il lock
lseek(fd, dim_mat*lx*me*sizeof(float),fl.l_whence);
int i;
int j;
for(j=0;j<lx;j++)
{
for(i=0;i<dim_mat;i++)
{
printf(" Sono arrivato : %d \n",me);
ris=write(fd,&matrice_trasposta_locale[i][j],1);
printf("Valore : %2.1f da %d \n ",matrice_trasposta_locale[i][j],me);
printf("Risultato: %d \n",ris);
}
}
fl.l_type = F_UNLCK;
fcntl(fd, F_SETLK, &fl);
}
Ultima modifica di Unrue : 03-01-2007 alle 11:44. |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Codice:
fd = open("home/gabriele/Desktop/output", O_WRONLY | O_CREAT);
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6284
|
Grazie del suggerimento,però open continua a ritornarmi -1
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
/home/gabriele/Desktop/output
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6284
|
Ma por... vero
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6284
|
Ho capito perchè: il primo processo crea il file. Ma tale file non ha permessi di scrittura. Ho provato a metterci un file vuoto ed a dare tutti i permessi in scrittura e lettura ed adesso tutti ci scrivono,strano però..
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Stavo leggendo adesso la documentazione di fcntl(). F_GETLK, F_SETLK e F_SETLKW sono definiti "Advisory locking". Vuol dire che non gestiscono un reale blocco "forzato" sul file. Vanno bene solo quando i processi "cooperano" insieme, cioè sanno di dover lavorare su un file comune e quindi effettuano questo tipo di lock.
Per dirla in breve: apri un file di testo con la open(), fai il lock e poi prova, da un altro prompt, a fare echo "blabla" > file. Vedrai che la echo scrive sul file. Tu pensi: ma l'ho bloccato!! Sì ma echo non "coopera" e non usa fcntl per fare il lock. In definitiva: usare F_GETLK, F_SETLK e F_SETLKW non ti para il sedere da qualunque altro processo che vuole scrivere sul file.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: May 2004
Messaggi: 1136
|
Quote:
La prima parte mi convince, parzialmente però quando ho tempo mi documenterò meglio, comunque ok. La seconda, come anche è ripetuto nell'ultimo post, non l'ho capita: nel senso che motivo c'è di essere cautelati da scritture di processi non previsti? Non mi pare sia richiesto da Unrue. Se si volesse così, penso si debba pensare su due livelli: uno di mutua esclusione e un altro di controllo di accesso al file (permessi?). |
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1451
|
Quote:
Per questo motivo se esegui scritture con processi diversi, non apriranno due volte lo stesso file, ma ciascun vedrà il file come proprio.
__________________
Ciao ~ZeRO sTrEsS~ |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:25.




















