微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何自动删除Unix IPC资源?

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

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

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

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

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

解决方法

AFAIK,没有真正便携的方式来处理自动删除SysV风格的IPC.

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

您可以让您的启动脚本清理任何孤立的资源,以使系统处于已知良好状态.系统uid拥有的任何东西都可以通过“ipcs | xargs ipcrm”类型的东西进行删除.当然你在失败/失败时仍然是孤儿,但谁在乎呢?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐