ven*_*tan 1 c++ unix shared-memory ipcs inter-process-communicat
我正在尝试编写一个C++程序来删除共享内存段.我知道可以从cmd提示符使用
ipcs -m | awk '{ print $2 }' | xargs ipcrm -m
但我正在尝试使用C++来创建一个共享内存垃圾收集器.
我们的想法是删除未附加到任何进程(nattach == 0)或status == 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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3989 次 |
| 最近记录: |