GNU/Linux >> Znalost Linux >  >> Linux

Odebrat sdílenou paměť posix, když se nepoužívá?

Pokud je při provádění vašeho programu bod, kdy je dobře známo, že všechny procesy, které potřebují otevřít segment sdílené paměti, již tak učinily, můžete jej bezpečně odpojit. Odpojením se objekt odebere z globálního jmenného prostoru, ale bude přetrvávat, dokud bude existovat alespoň jeden proces, který ponechá jeho deskriptor souboru otevřený. Pokud po tomto okamžiku dojde k selhání, deskriptor souboru se automaticky zavře a počet odkazů se sníží. Jakmile nezůstanou žádné otevřené deskriptory do nepropojeného bloku sdílené paměti, je odstraněn.

To je užitečné v následujícím scénáři:proces vytvoří blok sdílené paměti, odpojí jej a poté se rozdělí. Dítě zdědí deskriptor souboru a může používat blok sdílené paměti ke komunikaci s rodičem. Jakmile se oba procesy ukončí, blok se automaticky odstraní, jakmile se oba deskriptory souborů zavřou.

Když je blok sdílené paměti odpojen, není dostupný pro jiné procesy, aby jej otevřely. Pokud mezitím použijete shm_open() se stejným názvem jako odpojený blok by se místo toho vytvořil nový a zcela odlišný blok sdílené paměti.


Našel jsem způsob pomocí systémového příkazu a linuxového příkazu "fuser", které umožňují vypsat procesy, které otevřely soubor. Tímto způsobem můžete zkontrolovat, zda se soubor se sdílenou pamětí (umístěný v /dev/shm) stále používá, a pokud ne, smazat jej. Pamatujte, že operace kontroly / odstranění / vytvoření musí být uzavřeny v kritické sekci mezi procesy pomocí pojmenovaného mutexu nebo pojmenovaného semaforu nebo uzamčení souboru.

        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;
        }

Ne - alespoň na Linuxu jádro neobsahuje nic, co by to dokázalo. Je na některé aplikaci, aby v určitém okamžiku zavolala shm_unlink(), aby se zbavila segmentu sdílené paměti.


Linux
  1. Linux – Kdy nemám zabít -9 A proces?

  2. Kdy použít Nohup?

  3. Kdy použít dedikovaný server

  1. Jak používat sdílenou paměť s Linuxem v C

  2. Modul nebyl nalezen, když dělám modprobe

  3. příkaz nebyl nalezen při použití sudo

  1. Použití / při použití cd

  2. Proč je sdílená paměť jádra na Ubuntu 12.04 0?

  3. Proč používáme su – a nejen su?