Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C+;删除unix共享内存段+;程序 我试图编写一个C++程序来删除共享内存段。我知道可以通过cmd提示符使用_C++_Unix_Shared Memory_Inter Process Communicat_Ipcs - Fatal编程技术网

使用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,然后将参数传递给ipcrm
ipcs-m | awk'{print$2}
Geoffroy,我使用什么API?是的,我知道
shmctl(id,IPC\RMID,NULL)
但它只在您有段id的情况下起作用。我需要能够获得所有当前段id的列表,检查是否有任何附加到它的进程,检查它们是否处于活动状态,并删除非活动的一次,我知道
shmctl(id,IPC\u RMID,NULL)
但它只在您有段ID的情况下起作用。我需要能够获得所有当前段ID的列表,检查是否有任何附加到它的进程,检查它们是否处于活动状态,并删除非活动的一次