【问题标题】:Delete unix shared memory segments using a C++ program使用 C++ 程序删除 unix 共享内存段
【发布时间】:2012-03-20 08:36:00
【问题描述】:

我正在尝试编写一个 C++ 程序来删除共享内存段。我知道可以使用

从 cmd 提示符完成

ipcs -m | awk '{ print $2 }' | xargs ipcrm -m

但我正在尝试使用 C++ 来创建共享内存垃圾收集器。

想法是删除未附加到任何进程(nattach ==0)或状态== NULL的共享内存段

【问题讨论】:

  • 您是否尝试过从 C++ 执行命令?
  • 我认为如果您想手动操作,您将必须获得内核模式权限。如果可用,您仍然可以使用现有的 ABI 或 API,这可能更容易:)
  • 我想解析这段代码的输出并检查是否 nattach==0 然后将参数传递给 ipcrm ipcs -m | awk '{ print $2 }'
  • Geoffroy,我用什么 API?

标签: c++ unix shared-memory inter-process-communicat ipcs


【解决方案1】:

我建议执行strace ipcrm -m <your-arguments> 并查看它执行的系统调用。 大多数情况应该足够了(至少它会为您指明正确的方向),如果没有,请查看 ipcrm 的源代码。我很确定您不需要任何特殊权限(我系统上的 ipcrm 没有设置 SUID 或 SGID 位)。

【讨论】:

    【解决方案2】:

    根据ipcrmsource code,它调用shmctl

    shmctl(id, IPC_RMID, NULL)
    

    【讨论】:

    • 是的,我知道shmctl(id, IPC_RMID, NULL),但它只有在您拥有分段 ID 时才有效。我需要能够获取所有当前段 id 的列表,检查是否有任何进程附加到它并检查它们是否处于活动状态并删除非活动的一次
    【解决方案3】:

    我终于有了自己问题的答案。可以使用 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;
    }
    

    【讨论】:

      【解决方案4】:

      下面的代码使用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);//上面代码的使用示例

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-14
        • 2013-05-21
        • 2018-10-03
        • 1970-01-01
        • 2015-07-20
        • 1970-01-01
        • 2013-10-04
        • 2012-11-02
        相关资源
        最近更新 更多