获取所有共享内存段的大小

时间:2016-03-09 18:50:57

标签: c++ c solaris shared-memory

在Solaris上,可以使用shmctl来获取我没有创建的共享内存段的大小,并且我没有获得该权限?

例如,我想获得另一个用户只为他创建的段的大小(600)。

我尝试使用下面的代码来获取所有共享内存段的总大小,但我得到了拒绝权限

  

无法访问段0的共享内存信息,因为权限被拒绝

当我对某个细分受众群没有阅读权时。

int *ids = NULL;
uint_t nids = 0;
uint_t n;

unsigned long memoryUsed = 0;

if (shmids(ids, nids, &n) != 0)
{
   cout <<  "Failed to get shared memory info: " << strerror(errno);
   return 0;
}

nids =n;
ids = (int *) realloc(ids, nids * sizeof (int));

if (shmids(ids, nids, &n) != 0)
{
    cout <<  "Failed to get shared memory info: " << strerror(errno);
    return 0;
}
else
{    

    for (int i = 0; i < n; i++)
    {
        struct shmid_ds buf;
        int iError = shmctl(ids[i], IPC_STAT, &buf);
        if( iError < 0 )
        {
           cout << "Cannot access shared memory information for segment " << ids[i] << " because " << strerror(errno) << endl;
        } 
        else
        {
            memoryUsed += buf.shm_segsz;
        }
    }    
}

return memoryUsed;

我问这个问题,因为ipcs -ma命令能够获得所有现有段的大小,因此我应该能够这样做。

IPC status from <running system> as of Wed Mar  9 19:44:34 MET 2016
T         ID      KEY        MODE        OWNER    GROUP  CREATOR   CGROUP NATTCH      SEGSZ  CPID  LPID   ATIME    DTIME    CTIME
Shared Memory:
m        215   0          --rw-------  olivier    staff   olivier  staff      0       4096 10869 10869 19:10:21 19:10:21 19:10:21
m          0   0x8d0c6ee7 --rw-------  oracle     dba     oracle   dba        4 40956239872   785  2275  7:17:38  7:17:38  7:16:47

0 个答案:

没有答案