Jika ada poin dalam eksekusi program Anda yang diketahui bahwa semua proses yang perlu membuka segmen memori bersama telah melakukannya, Anda dapat memutuskan tautannya dengan aman. Membatalkan tautan akan menghapus objek dari namespace global tetapi masih tetap ada selama setidaknya ada satu proses yang membuat deskriptor file tetap terbuka. Jika crash terjadi setelah titik itu, deskriptor file ditutup secara otomatis dan jumlah referensi dikurangi. Setelah tidak ada lagi deskriptor terbuka untuk blok memori bersama yang dibatalkan tautannya, blok tersebut akan dihapus.
Ini berguna dalam skenario berikut:proses membuat blok memori bersama, memutuskan tautannya, lalu bercabang. Anak mewarisi deskriptor file dan dapat menggunakan blok memori bersama untuk berkomunikasi dengan orang tua. Setelah kedua proses dihentikan, blok dihapus secara otomatis karena kedua deskriptor file ditutup.
Saat tidak ditautkan, blok memori bersama tidak tersedia untuk proses lain untuk membukanya. Sedangkan jika salah gunakan shm_open()
dengan nama yang sama dengan blok yang tidak ditautkan, blok memori bersama yang baru dan sama sekali berbeda akan dibuat sebagai gantinya.
Saya menemukan cara menggunakan perintah sistem dan perintah Linux "fuser" yang memungkinkan untuk membuat daftar proses yang membuka file. Dengan cara ini, Anda dapat memeriksa apakah file memori bersama (terletak di /dev/shm") masih digunakan dan menghapusnya jika tidak. Perhatikan bahwa operasi periksa / hapus / buat harus disertakan dalam bagian kritis antar-proses menggunakan mutex bernama atau semafor bernama atau kunci 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;
}
Tidak - setidaknya di Linux, kernel tidak mengandung apa pun yang dapat melakukan ini. Terserah beberapa aplikasi untuk memanggil shm_unlink() di beberapa titik untuk menghilangkan segmen memori bersama.