在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