使用C+;删除unix共享内存段+;程序 我试图编写一个C++程序来删除共享内存段。我知道可以通过cmd提示符使用
使用C+;删除unix共享内存段+;程序 我试图编写一个C++程序来删除共享内存段。我知道可以通过cmd提示符使用,c++,unix,shared-memory,inter-process-communicat,ipcs,C++,Unix,Shared Memory,Inter Process Communicat,Ipcs,ipcs-m | awk'{print$2}| xargs-ipcrm-m 但是我尝试用C++来做,这样我就创建了一个共享内存垃圾收集器。 其思想是删除未连接到任何进程的共享内存段(nattach==0)或状态==NULL我建议执行strace ipcrm-m并查看它执行的系统调用。在大多数情况下,这应该是足够的(至少它将为您指明正确的方向),如果不是,请查看ipcrm的源代码。我很确定您不需要任何特权(我系统上的ipcrm没有设置SUID或SGID位)。我建议执行strace ipcrm-m,
ipcs-m | awk'{print$2}| xargs-ipcrm-m
<>但是我尝试用C++来做,这样我就创建了一个共享内存垃圾收集器。
其思想是删除未连接到任何进程的共享内存段(nattach==0)或状态==NULL我建议执行
strace ipcrm-m
并查看它执行的系统调用。在大多数情况下,这应该是足够的(至少它将为您指明正确的方向),如果不是,请查看ipcrm的源代码。我很确定您不需要任何特权(我系统上的ipcrm没有设置SUID或SGID位)。我建议执行strace ipcrm-m
,看看它执行什么系统调用。在大多数情况下,这应该是足够的(至少它将为您指明正确的方向),如果不是,请查看ipcrm的源代码。我很确定您不需要任何特权(我系统上的ipcrm并没有设置SUID或SGID位)。根据ipcrm
的一个例子,它调用
根据ipcrm
的一个函数,它调用
我终于找到了我自己问题的答案。可以使用shmctl标志来完成。
shmctl(0,SHM_信息和SHM_信息)代码>提供当前存在的段数
shmctl(i、SHM\u STAT和SHM\u段)
给出段id
它也可以通过shm\u段访问。shm\u 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;
}
#包括
int delete_段(int seg_id){
if((shmctl(seg_id,IPC_RMID,0))=-1){
std::cout我终于有了自己问题的答案。可以使用shmctl标志来完成。
shmctl(0,SHM_INFO,&SHM_INFO);
给出当前存在的段数
shmctl(i、SHM\u STAT和SHM\u段)
给出段id
它也可以通过shm\u段访问。shm\u 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;
}
#包括
int delete_段(int seg_id){
if((shmctl(seg_id,IPC_RMID,0))=-1){
std::cout下面的代码使用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);
}}
void clean_段(int startId,int endId){
对于(int i=startId;i以下代码使用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);
}}
void clean_段(int startId,int endId){
对于(int i=STARTID),您是否已经尝试过用C++执行命令?如果您想手工操作,我想您将不得不获得内核模式特权。如果可用的话,您仍然可以使用现有的ABI或API,这可能更容易:)我想解析这个代码的输出,并检查NataTch=0,然后将ARGS传递到IPCRM <代码> IPCS - M.AWK。{打印2美元} <代码>杰弗洛伊,我用什么API?你试过从C++执行命令吗?我认为如果你想手工操作,你必须获得内核模式特权。如果可用,你仍然可以使用现有的ABI或API,这可能更容易:我想解析这段代码的输出,检查nattach==0,然后将参数传递给ipcrmipcs-m | awk'{print$2}
Geoffroy,我使用什么API?是的,我知道shmctl(id,IPC\RMID,NULL)
但它只在您有段id的情况下起作用。我需要能够获得所有当前段id的列表,检查是否有任何附加到它的进程,检查它们是否处于活动状态,并删除非活动的一次,我知道shmctl(id,IPC\u RMID,NULL)
但它只在您有段ID的情况下起作用。我需要能够获得所有当前段ID的列表,检查是否有任何附加到它的进程,检查它们是否处于活动状态,并删除非活动的一次