进程未调用的结果 shm_unlink
Consequence of Process not calling shm_unlink
我的程序有2个进程,一个master和一个slave。主机通过共享内存缓冲区与从机通信。 master 创建共享内存
shm_open("shared_buff", O_CREAT | O_RDWR, 0666);
slave 使用相同的 shm_open 行将其指针放入 buff。 master 可能会在 slave 有机会正常关闭并在共享内存 buff 上调用 shm_unlink() 之前杀死 slave。我想知道这是否会导致内存泄漏,如果是的话我能做些什么吗?
我目前正面临一个错误,在主人杀死奴隶并试图重新启动它后,奴隶不再有权访问缓冲区。我不是 100% 确定这是否是问题的原因,但似乎有可能。需要明确的是,第一次通过时一切都运行良好,只有在第二次启动从站时才会出现问题。据我所知,没有错误或堆栈跟踪被打印出来。
另一种解决方案是,新链接的共享内存对象(在从端)将简单地替换旧的分配。这样的事情可能吗?
SysV 共享内存是全局的、系统范围的资源。如果你用完了不释放,最终你会运行出局。
如果主进程和从进程都使用 O_CREAT
打开共享内存,并且其中一个进程设法成功调用 shm_unlink
,那么下一次调用 shm_open
将创建一个新的共享内存对象,不同于第一个(shm_unlink
手册页描述中的一个小条款)。我怀疑这是你第二次看到的。
我建议主进程单独负责使用 O_CREAT
和 O_EXCL
创建共享内存对象(并设置文件大小等)。然后,从属进程应该使用 O_RDWR(或任何合适的)打开共享内存,然后使用 close
来摆脱文件描述符(以受控方式或在从属进程时由内核进程被杀死)。 sm_unlink 所做的只是从共享内存对象名称的命名空间中删除共享内存对象的名称(就像 unlink
只是从目录中删除文件名一样),这应该由 master 完成其正常(确保正确捕获信号)关闭的一部分。
我的程序有2个进程,一个master和一个slave。主机通过共享内存缓冲区与从机通信。 master 创建共享内存
shm_open("shared_buff", O_CREAT | O_RDWR, 0666);
slave 使用相同的 shm_open 行将其指针放入 buff。 master 可能会在 slave 有机会正常关闭并在共享内存 buff 上调用 shm_unlink() 之前杀死 slave。我想知道这是否会导致内存泄漏,如果是的话我能做些什么吗?
我目前正面临一个错误,在主人杀死奴隶并试图重新启动它后,奴隶不再有权访问缓冲区。我不是 100% 确定这是否是问题的原因,但似乎有可能。需要明确的是,第一次通过时一切都运行良好,只有在第二次启动从站时才会出现问题。据我所知,没有错误或堆栈跟踪被打印出来。
另一种解决方案是,新链接的共享内存对象(在从端)将简单地替换旧的分配。这样的事情可能吗?
SysV 共享内存是全局的、系统范围的资源。如果你用完了不释放,最终你会运行出局。
如果主进程和从进程都使用 O_CREAT
打开共享内存,并且其中一个进程设法成功调用 shm_unlink
,那么下一次调用 shm_open
将创建一个新的共享内存对象,不同于第一个(shm_unlink
手册页描述中的一个小条款)。我怀疑这是你第二次看到的。
我建议主进程单独负责使用 O_CREAT
和 O_EXCL
创建共享内存对象(并设置文件大小等)。然后,从属进程应该使用 O_RDWR(或任何合适的)打开共享内存,然后使用 close
来摆脱文件描述符(以受控方式或在从属进程时由内核进程被杀死)。 sm_unlink 所做的只是从共享内存对象名称的命名空间中删除共享内存对象的名称(就像 unlink
只是从目录中删除文件名一样),这应该由 master 完成其正常(确保正确捕获信号)关闭的一部分。