2013-03-24 10 views
12

Sono confuso dal linux man pages per shmctl(). Io uso il seguente comando: shmctl (id , IPC_RMID , 0) per rimuovere un segmento condiviso. Il man pages sembra contraddire se stesso sulla durata della memoria.Eliminazione del segmento di memoria condivisa con shmctl

Il man pages Stato:

IPC_RMID

Mark segmento di essere distrutto. Il segmento verrà effettivamente distrutto solo dopo che l'ultimo processo lo ha staccato (vale a dire, quando il membro shm_nattch della struttura associata shmid_ds è zero). Il chiamante deve essere il proprietario o il creatore o essere privilegiato. Se un segmento è stato contrassegnato per la distruzione, verrà impostato il flag (non standard) SHM_DEST del campo shm_perm.mode nella struttura dati associata recuperata da IPC_STAT.

Se ho ragione, credo che questo significa che se si dispone di due processi che entrambi attribuiscono alla memoria condivisa, (Lets chiamarli Process1 e Process2), Process1 potrebbe creare la memoria condivisa, collegare, staccare, distruggere il condiviso memoria, e alla fine terminare. Quindi la memoria continuerà a esistere fino a quando Process2 si staccherà anche.

È corretto?

In secondo luogo, che cosa significa questa affermazione nel man pages media:

Il chiamante deve garantire che un segmento è poi distrutto; altrimenti le sue pagine che sono state segnalate in errore rimarranno nella memoria o nello scambio .

Questo fa sembrare come Process1, dal momento che ha segnato il segmento per l'eliminazione, avrebbe bisogno di bloccare fino a quando tutti gli altri processi sono staccati al fine di garantire la memoria viene cancellato. Ma questo sembra contraddire la dichiarazione di cui sopra. Non ho idea di come sarebbe stato fatto (se si suppone che sia fatto), quindi se questo è il caso, potresti spiegare anche come andrei su questo.

risposta

15

Il tuo primo ragionamento è corretto. Il segmento condiviso esisterà fino a entrambi: è contrassegnato con IPC_RMID e l'ultimo processo si stacca.

Lo scopo del secondo frammento è ricordarvi che in una soluzione che utilizza la memoria condivisa è necessario che alcuni processi lo contrassegnino per la distruzione o rimarrà in memoria/scambio per sempre. Potrebbe essere una buona idea usare IPC_RMID subito dopo aver creato il segmento.

Se non si è sicuri di aver rilasciato correttamente la memoria, è possibile utilizzare il programma ipcs per elencare i segmenti rimanenti.

Problemi correlati