如何自动删除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”类型的东西进行删除.当然你在失败/失败时仍然是孤儿,但谁在乎呢? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |