加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何自动删除Unix IPC资源?

发布时间:2020-12-16 01:57:16 所属栏目:安全 来源:网络整理
导读:我需要将一些应用程序从 Windows移植到 Linux,它们使用共享内存和信号量.我必须替换一些Winddows函数,例如CreateFileMapping / OpenFileMapping和CreateSemaphore / OpenSemaphore.我稍后会为信号量和共享内存编写一个通用接口. 在Windows上,当所有句柄都关
我需要将一些应用程序从 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”类型的东西进行删除.当然你在失败/失败时仍然是孤儿,但谁在乎呢?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读