Мне нужно портировать некоторые приложения с Windows на Linux, и они используют общую память и семафоры.Я должен заменить некоторые функции Winddows, такие как CreateFileMapping / OpenFileMapping и CreateSemaphore / OpenSemaphore.Я напишу общий интерфейс для семафора и разделяемой памяти позже.
В Windows, когда все дескрипторы закрыты, ресурс (семафор или разделяемая память) удаляется системой.Однако Unix требует, чтобы я удалил ресурс, используя shm_unlink (разделяемая память, открытая shm_open) и sem_unlink (семафор, открытый sem_open).shm_open хорош, потому что он не создает настоящий файл на диске.
Я не могу использовать shmget, потому что он требует числа в качестве идентификатора вместо строки.ftok совершенно бесполезен, потому что он может генерировать коллизии.
Я не могу вызвать * _unlink, пока все дескрипторы не будут закрыты, потому что он не знает, когда ни одному новому процессу это не понадобится, и процесс может аварийно завершиться или может быть вручную убитпользователь.
Если я не откажусь от них, они оставят мусор в системе, и если группа процессов будет запущена снова, они не будут знать, используются ли ресурсы другими процессами или являются старыми (этоне был отключен, пользователь убил процесс или процесс потерпел крах).