c++ - 使用 C++ 程序删除 unix 共享内存段

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

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

在 cmd 提示符下完成

ipcs -m | awk '{ 打印 $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;
}

关于c++ - 使用 C++ 程序删除 unix 共享内存段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9523167/

相关文章:

c++ - QSharedMemory::create() 问题

c++ - C++ 和 C 中的 union 初始化

c++ - 如何让 CImg 库为 Qt 工作

c++ - 使用 VBO 渲染顶点的问题 - OpenGL

c++ - 使用与 O_CLOEXEC 相同的 accept4() 设置 SOCK_CLOEXEcflags的目的是什么

c++ - sizeof 在编译不同的程序时为结构返回不同的值

c++ - 将自己的类的实例传递给另一个

c - 如何将 execlp() 与重定向输出一起使用

c - C 中的 tcgetpgrp 函数

c - 在哪里放置用于从共享内存段读取和写入的信号量?