Semaforo di memoria condivisa
-
05-07-2019 - |
Domanda
Ho 10 processi in esecuzione, ognuno dei quali scrive nello stesso file. Non voglio più autori, quindi in sostanza sto cercando un semaforo mutex / binario per proteggere le scritture di file. Il problema è che non riesco a condividere il semaforo tra 10 processi, quindi sto cercando di utilizzare la memoria condivisa tra 10 processi e di inserire il semaforo nella memoria condivisa in modo che sia possibile accedervi da ciascun processo.
Qualcuno può indicarmi la documentazione su questo in C / C ++ per Unix? Il codice di esempio per utilizzare questa struttura sarebbe fantastico.
Grazie
Soluzione
Sembra che staresti meglio usando flock (2)
:
flock(fd, LOCK_EX);
n = write(fd, buf, count);
flock(fd, LOCK_UN);
Altri suggerimenti
Mettere un semaforo nella memoria condivisa non è la soluzione migliore a questo problema (se anche funzionasse). È necessario esaminare il blocco dei file, che è una funzionalità UNIX specificatamente progettata per fornire esclusività tra i file writer.
In particolare, controlla:
Per altro materiale esplicativo, vedi Programmazione avanzata in ambiente UNIX, sezione 14.3
Dai un'occhiata a Vol. di programmazione di rete UNIX 2 di W. Richard Stevens.
È il miglior libro mai scritto su questo argomento.
È possibile utilizzare i mutex PTHREAD. Durante l'inizializzazione di un mutex è necessario utilizzare la funzione pthread_mutexattr_setpshared condiviso tra i processi e quindi inserirlo in una memoria condivisa. Tutti i processi possono collegarsi alla memoria condivisa e quindi accedere al mutex.
Inoltre è possibile aggiungere ulteriori attributi a SHM in base al requisito di blocco (ricorsivo, ecc.)
Che ne dici di usare UNIX IPC per creare una coda condivisa. Un processo legge la coda e scrive sul file, tutti gli altri processi spingono i dati in coda.