GNU/Linux >> Linux Esercitazione >  >> Linux

Rimuovere la memoria condivisa posix quando non in uso?

Se c'è un punto nell'esecuzione del tuo programma quando è ben noto che tutti i processi che devono aprire il segmento di memoria condivisa lo hanno già fatto, puoi tranquillamente scollegarlo. Lo scollegamento rimuove l'oggetto dallo spazio dei nomi globale, ma persiste finché esiste almeno un processo che mantiene aperto il suo descrittore di file. Se si verifica un arresto anomalo dopo quel punto, il descrittore di file viene chiuso automaticamente e il conteggio dei riferimenti viene decrementato. Una volta che non rimangono più descrittori aperti al blocco di memoria condivisa non collegato, viene eliminato.

Ciò è utile nel seguente scenario:un processo crea un blocco di memoria condivisa, lo scollega e quindi esegue il fork. Il figlio eredita il descrittore di file e può utilizzare il blocco di memoria condivisa per comunicare con il genitore. Una volta terminati entrambi i processi, il blocco viene automaticamente rimosso quando entrambi i descrittori di file vengono chiusi.

Mentre non è collegato, il blocco di memoria condivisa non è disponibile per altri processi per aprirlo. Nel frattempo, se si usa shm_open() con lo stesso nome del blocco non collegato, verrebbe invece creato un nuovo blocco di memoria condivisa completamente diverso.


Ho trovato un modo usando un comando di sistema e il comando Linux "fuser" che permettono di elencare i processi che hanno aperto un file. In questo modo, puoi verificare se il file di memoria condivisa (che si trova in /dev/shm") è ancora in uso e cancellarlo in caso contrario. Nota che le operazioni di controllo / cancellazione / creazione devono essere racchiuse in una sezione critica inter-processi utilizzando un mutex denominato o un semaforo denominato o un blocco file.

        std::string shm_file = "/dev/shm/" + service_name + "Shm";
        std::string cmd_line = "if [ -f " + shm_file + " ] ; then if ! fuser -s " + shm_file + " ; then rm -f " + shm_file + " ; else exit 2 ; fi else exit 3 ; fi";
        int res = system(cmd_line.c_str());
        switch (WEXITSTATUS(res)) {
        case 0: _logger.warning ("The shared memory file " + shm_file + " was found orphan and is deleted");         break;
        case 1: _logger.critical("The shared memory file " + shm_file + " was found orphan and cannot be deleted");  break;
        case 2: _logger.trace   ("The shared memory file " + shm_file + " is linked to alive processes");            break;
        case 3: _logger.trace   ("The shared memory file " + shm_file + " is not found");                            break;
        }

No - almeno su Linux, il kernel non contiene nulla che possa farlo. Spetta a qualche applicazione chiamare shm_unlink() a un certo punto per sbarazzarsi di un segmento di memoria condivisa.


Linux
  1. Linux – Quando non dovrei uccidere -9 Un processo?

  2. Esempi di comandi ipcs in Linux

  3. Quando utilizzare un server dedicato

  4. Raccomandazione sulla comunicazione tra processi

  5. Memoria condivisa di Linux:shmget() vs mmap()?

gratuito:comando non trovato

Come utilizzare la memoria condivisa con Linux in C

comando non trovato quando si utilizza sudo

Uso di / quando si usa cd

Perché usiamo su - e non solo su?

rkhunter:segmenti di memoria condivisa sospetti