如何自动删除Unix IPC资源



我需要将一些应用程序从Windows移植到Linux,它们使用共享内存和信号量。我必须替换一些WindWindows函数,如CreateFileMapping/OpenFileMapping和CreateSemaphore/OpenSemahore。稍后我将为信号量和共享内存编写一个通用接口。

在Windows上,当所有句柄都关闭时,系统会删除资源(信号量或共享内存)。然而,Unix要求我删除shm_unlink(由shm_open打开的共享内存)和sem_unlink(由sem_open打开的信号量)的资源。shm_open很好,因为它不会在磁盘中创建真正的文件。

我不能使用shmget,因为它需要一个数字作为标识符,而不是字符串。ftok是完全无用的,因为它可能会产生碰撞。

在关闭所有句柄之前,我不能调用*_unlink,因为它不知道什么时候没有新进程需要它,并且进程可能会崩溃或被用户手动终止。

如果我不解除它们的链接,它们将在系统中留下垃圾,如果进程组再次启动,它们将不知道资源是否被其他进程使用或是旧的(它没有解除链接,用户杀死了进程或进程崩溃)。

AFAIK,没有真正可移植的方法来处理自动删除SysV风格的IPC。

一种选择是创建一个监督守护进程,它的唯一任务是管理/拥有共享的mem/信号量资源。适用于某些操作系统的一个技巧是让该进程将共享内存标记为已删除,操作系统将在关闭所有句柄时执行此操作。这是不可移植的,因为在一些操作系统上,试图连接到标记区域的新进程将返回EINVAL/EACCESS。

您可以让启动脚本清理任何孤立的资源,使系统达到已知的良好状态。系统uid拥有的任何东西都可以通过"ipcs|xargs-ipcrm"类型的东西进行删除。当然,你仍然在把事情归咎于失败/失败,但谁在乎呢?

最新更新