Как автоматически удалить ресурсы Unix IPC? - PullRequest
4 голосов
/ 29 января 2012

Мне нужно портировать некоторые приложения с Windows на Linux, и они используют общую память и семафоры.Я должен заменить некоторые функции Winddows, такие как CreateFileMapping / OpenFileMapping и CreateSemaphore / OpenSemaphore.Я напишу общий интерфейс для семафора и разделяемой памяти позже.

В Windows, когда все дескрипторы закрыты, ресурс (семафор или разделяемая память) удаляется системой.Однако Unix требует, чтобы я удалил ресурс, используя shm_unlink (разделяемая память, открытая shm_open) и sem_unlink (семафор, открытый sem_open).shm_open хорош, потому что он не создает настоящий файл на диске.

Я не могу использовать shmget, потому что он требует числа в качестве идентификатора вместо строки.ftok совершенно бесполезен, потому что он может генерировать коллизии.

Я не могу вызвать * _unlink, пока все дескрипторы не будут закрыты, потому что он не знает, когда ни одному новому процессу это не понадобится, и процесс может аварийно завершиться или может быть вручную убитпользователь.

Если я не откажусь от них, они оставят мусор в системе, и если группа процессов будет запущена снова, они не будут знать, используются ли ресурсы другими процессами или являются старыми (этоне был отключен, пользователь убил процесс или процесс потерпел крах).

1 Ответ

1 голос
/ 30 января 2012

AFAIK, нет никакого реального портативного способа автоматически удалять IPC в стиле SysV.

Один из вариантов - создание контролирующего процесса демона, единственной задачей которого является управление / владение общими ресурсами mem / семафоров. Хитрость, которая работает с некоторыми ОС, заключается в том, чтобы этот процесс помечал разделяемую память как удаленную, что ОС будет делать после закрытия всех дескрипторов. Это не переносимо, так как в некоторых новых процессах ОС, пытающихся подключиться к отмеченному региону, будет возвращаться EINVAL / EACCESS.

Вы могли бы заставить ваш скрипт запуска очистить любые потерянные ресурсы, чтобы привести систему в известное исправное состояние. Все, что принадлежит вашей системной системе uid, может быть использовано для удаления с помощью типа «ipcs | xargs ipcrm». Уверены, что вы все еще осиротели из-за неудачи / неудачи, но кого это волнует?

...