使用C++程序删除unix共享内存段
Delete unix shared memory segments using a C++ program
我正在尝试编写一个C++程序来删除共享内存段。我知道可以使用从cmd提示符完成
ipcs -m | awk '{ print $2 }' | xargs ipcrm -m
但是我正在尝试使用C++来实现这一点,以便创建一个共享内存垃圾收集器。
其想法是删除未附加到任何进程(nattach==0)或状态==NULL 的共享内存段
我终于有了自己问题的答案。这可以使用shmctl标志来完成。shmctl(0,SHM_INFO,&shm_info);
给出了当前存在的分段数。
shmctl(i , SHM_STAT , &shm_segment)
给出段id
它也可以由shm_segment.shm_id
访问
#include <sys/shm.h>
int delete_segment(int seg_id){
if ((shmctl(seg_id,IPC_RMID,0))==-1){
std::cout<<" ERROR(C++)with shmctl(IPC_RMID): "<<strerror(errno)<<std::endl;
return -1;
}else//on success
return 0;
}
void clean_segments(){
struct shmid_ds shm_info;
struct shmid_ds shm_segment;
int max_id = shmctl(0,SHM_INFO,&shm_info);
if (max_id>=0){
for (int i=0;i<=max_id;++i) {
int shm_id = shmctl(i , SHM_STAT , &shm_segment);
if (shm_id<=0)
continue;
else if (shm_segment.shm_nattch==0){
delete_segment(shm_id);
}
}
}
return result;
}
根据ipcrm
的源代码,它调用shmctl
。
shmctl(id, IPC_RMID, NULL)
我建议执行strace ipcrm -m <your-arguments>
,看看它执行什么系统调用。在的大多数情况下,应该是足够的(至少它会为您指明正确的方向),如果不是,请查看ipcrm的源代码。我确信您不需要任何特殊权限(我的系统上的ipcrm没有设置SUID或SGID位)。
下面的代码使用I:
void clean_segments(int startId, int endId) {
for (int i=startId; i<=endId; ++i) {
struct shmid_ds shm_segment;
int shm_id = shmctl(i, SHM_STAT, &shm_segment);
delete_segment(shm_id);
printf("Segment %d has been deletedn", shm_id);
}}
clean_segments(1146894、6357160);//使用上的代码的示例
相关文章:
- 使用Boost Interprocess创建托管共享内存需要很长时间
- 字符串共享内存映射的向量
- CUDA 使用共享内存平铺 3D 卷积实现
- 共享内存:MapViewOfFile 返回错误 5
- 如何在多写入器情况下对文件支持的共享内存中的大页面出错
- 有没有办法列出所有共享内存对象的名称?
- 共享内存的升压容器是否实现锁定?
- 共享内存中的健壮互斥锁不是那么健壮
- 使用IPC/共享内存将Integer数组从C++传递到Python
- 共享内存和性能
- 在这种特殊情况下,我是否需要在共享内存中使用原子类型
- 是否可以在专用内存空间中分配一个为提升管理共享内存而创建的对象
- fork(),在C中共享内存和指针
- 访问共享内存而不使用易失性、std::atomic、信号量、互斥锁和自旋锁
- 提升进程间共享内存open_or_create每次都会引发异常
- 通过 mmap-ed 共享内存传递可变长度 C 字符串
- 越界访问 CUDA 共享内存
- 在共享内存中插入映射映射时出现编译器错误
- 矩阵矢量产品 CUDA 通过平铺和共享内存提高性能
- 如何更改在 c++ 中使用提升库创建的共享内存的路径