Как отсоединить сегменты разделяемой памяти, если процесс неожиданно умирает? - PullRequest
2 голосов
/ 20 сентября 2019

Мне нужна разделяемая память в моей программе, но если процесс неожиданно прекратит работу, сегменты разделяемой памяти все равно будут существовать и вызывать ошибку сегмента при каждом запуске программы.Есть ли способ убедиться, что совместно используемая память отключается после завершения процесса, без необходимости явного вызова unlink?Я слышал, что System V может сделать это с shmctl, но есть ли способ сделать это с POSIX?

Например, если я нахожусь в Linux и имею код:

char** global_msg;
int shm_fd1 = shm_open("GLOBAL_MSG", O_CREAT | O_EXCL | O_RDWR, S_IRWXU | S_IRWXG);
ftruncate(shm_fd, MAX_MSG_LEN);
global_msg = (char **) mmap(NULL, MAX_MSG_LEN, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);

*global_msg = 0;

как мне убедиться, что "GLOBAL_MSG" не связан, если процесс неожиданно умирает?

1 Ответ

0 голосов
/ 22 сентября 2019

Это должно работать:

char** global_msg;
int shm_fd = shm_open("GLOBAL_MSG", O_CREAT | O_EXCL | O_RDWR, S_IRWXU | S_IRWXG);
ftruncate(shm_fd, MAX_MSG_LEN);
global_msg = (char **) mmap(NULL, MAX_MSG_LEN, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
shm_unlink("GLOBAL_MSG")
*global_msg = 0;

Точно так же, как POSIX позволяет вам удалить файл, пока он открыт, и по-прежнему работать с содержимым, и файл действительно исчезает только после его закрытия всеми программами,как и разделяемая памятьдо возврата shm_unlink (), но удаление содержимого объекта памяти должно быть отложено до тех пор, пока не будут удалены все открытые и сопоставленные ссылки на объект общей памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...