Ho più app compilate con g ++, in esecuzione su Ubuntu. Sto usando i nomi dei semafori per coordinare tra diversi processi.Come si ripristina un semaforo quando il processo che lo ha ridotto a zero si arresta in modo anomalo?
Tutto funziona bene, tranne nella seguente situazione: se uno dei processi chiamate sem_wait()
o sem_timedwait()
per decrementare il semaforo e poi si blocca o viene ucciso -9 prima che ha la possibilità di chiamare sem_post()
, poi da quel momento in poi , il semaforo nominato è "inutilizzabile".
Con "inutilizzabile", ciò che intendo è che il conteggio del semaforo è ora zero e il processo che dovrebbe averlo riportato a 1 è morto o è stato ucciso.
Non riesco a trovare un'API sem_*()
che potrebbe dirmi che il processo che ha decrementato per ultimo si è arrestato.
Mi manca un'API da qualche parte?
Ecco come apro il semaforo di nome:
sem_t *sem = sem_open("/testing",
O_CREAT | // create the semaphore if it does not already exist
O_CLOEXEC , // close on execute
S_IRWXU | // permissions: user
S_IRWXG | // permissions: group
S_IRWXO , // permissions: other
1 ); // initial value of the semaphore
Ecco come ho farlo diminuire:
struct timespec timeout = { 0, 0 };
clock_gettime(CLOCK_REALTIME, &timeout);
timeout.tv_sec += 5;
if (sem_timedwait(sem, &timeout))
{
throw "timeout while waiting for semaphore";
}
+1, in fin dei conti fare la stessa cosa, i semafori sono inutili in tali scenari –
Qualcuno mi ha mandato una e-mail per chiedere maggiori dettagli. Ho scritto un piccolo post sul blog quasi 3 anni fa quando mi sono imbattuto in questo problema. Maggiori dettagli su come ho risolto il problema con il blocco dei file sono disponibili qui: http://charette.no-ip.com:81/programming/2010-01-13_PosixSemaphores/index.html –
La stessa cosa può essere ottenuta semplicemente aprendo un chiudere un file? Ho trovato questo nella pagina man per open(): "Quando si apre un file, è possibile ottenere una semantica lock con flock (2) impostando O_SHLOCK per un blocco condiviso o O_EXLOCK per un blocco esclusivo." –