我正在尝试编写一个 C++ 程序来删除共享内存段。我知道可以使用 cmd 提示符来完成
ipcs -m | awk '{ print $2 }' | xargs ipcrm -m
但我正在尝试使用 C++ 来实现它,以便创建一个共享内存垃圾收集器。
这个想法是删除未附加到任何进程( nattach ==0)或状态 == NULL 的共享内存段
我正在尝试编写一个 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;
}
我建议执行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 deleted\n", shm_id);
}}
clean_segments(1146894, 6357160);// 使用上面代码的例子