Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何自动删除Unix IPC资源?_Unix_Ipc_Porting_Shared Memory - Fatal编程技术网

如何自动删除Unix IPC资源?

如何自动删除Unix IPC资源?,unix,ipc,porting,shared-memory,Unix,Ipc,Porting,Shared Memory,我需要将一些应用程序从Windows移植到Linux,它们使用共享内存和信号量。我必须替换一些Winddows函数,比如CreateFileMapping/OpenFileMapping和CreateSemaphore/OpenSemaphore。稍后我将为信号量和共享内存编写一个公共接口 在Windows上,当关闭所有句柄时,系统将删除资源(信号量或共享内存)。但是,Unix要求我删除资源,使用shm_unlink(共享内存由shm_open打开)和sem_unlink(信号量由sem_ope

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

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

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

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


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

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

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

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