Newsgroup: it.comp.www.php
Titolo: verificare se un file e' gia' stato aperto

$fn = __DIR__ . '/abc.txt';
fopen($fn, 'w');
fopen($fn, 'w');
 
come vedete viene aperto due volte lo stesso file, senza che venga 
generato nesssun errore...
 
Ma la domanda ï¿œ la seguente:
 
E' possibile sapere se un determinato file ($fn) ï¿œ attualmente aperto o no?

E' possibile sapere se un determinato file ($fn) è attualmente aperto o no?
 
Devi bloccarlo in scrittura con flock() la prima volta che lo apri. Nel caso
che il tuo scenario sia piu' complesso potrebbero servirti dei semafori, che
in PHP non so se esistano per tutte le piattaforme.
 
Leonardo
 
-- 
 
Then felt I like some watcher of the skies, when a new planet swims into his ken;
Or like stout Cortez when with eagle eyes, he star'd at the Pacific; and all his men
Look'd at each other with a wild surmise - silent, upon a peak in Darien.

 in PHP non so se esistano per tutte le piattaforme.
$fn = __DIR__ . '/abc.txt';
$fp = fopen($fn, "w+");
flock($fp, LOCK_EX);
 
// Non si dovrebbe riuscire a:
 
// riaprire una seconda volta
fopen($fn, 'w');
 
// eliminarlo/rinominarlo
unlink($fn);//rename($fn, 'abc');
 
 
Si riesce a riaprirlo e anche a cancellarlo (o rinominarlo).
Forse non mi sono spiegato :-|

fopen($fn, 'w');
 
Allora per fare questo ti serve un semaforo. flock() impedisce la scrittura,
ma il file puo' essere aperto (provato adesso, SuSE 12.3 64bit).
 
http://www.php.net/manual/it/book.sem.php
 


 
http://www.php.net/manual/it/book.sem.php
 
 
$key     = ftok(__FILE__,'m');
$a        = sem_get($key);
 
function test($a) {
 
     var_dump('--- inizio ---');
     sem_acquire($a);
     var_dump('--- fine ---');
 
}
 
test($a);
test($a);
 
 
La seconda volta che viene richiamata la funzione test(), giustamente 
l'esecuzione si blocca (rimane in attesa...); ma io vorrei invece che 
venga generato un errore, tipo: il file � gi� bloccato...
 

venga generato un errore, tipo: il file è già bloccato...
 
Potresti usare una variabile in shared memory, bloccata da un semaforo.


 Potresti usare una variabile in shared memory, bloccata da un semaforo.
 
posso chiedere un esempio?


http://www.brosulo.net/content/informatica/shared-memory-php
 
 
-- 
g4b0, linux user n. 369000
http://brosulo.net
 


io, quando devo accedere a dei file in scrittura, uso il codice sotto.
$filename non è il file a cui accedo, ma solo quello che mi fa da 
semaforo, se ho il mutex allora posso lavorare tranquillamente con i 
file. Naturalmente è di tipo cooperativo, cioè qualunque codice che 
lavora con gli stessi file deve prima acquisire il mutex.
Ciao
 
//------------------------
function getMutex($filename)
{
   for($i = 0; $i < 50; ++$i) {
     $handle = fopen($filename, "w");
     if($handle) {
       if(flock($handle, LOCK_EX))
         return $handle;
       fclose($handle);
       }
     usleep(200);
     }
   return 0;
}
//------------------------
function releasetMutex($handleMutex, $filename)
{
   if(!$handleMutex)
     return;
   flock($handleMutex, LOCK_UN);
   fclose($handleMutex);
   unlink($filename);
}
//-----------------------------------------------------