当前位置: 技术问答>linux和unix
IPC的权限问题
来源: 互联网 发布时间:2016-04-18
本文导语: 大家好,请教一个IPC权限问题,我创建了一个共享内存后,在shmat的时候出错,具体原因就是我不具备权限,系统输出错误为:Permission denied。 其中的要点在于; 1, 我创建共享内存的时候, 设置的权限为666,我创...
大家好,请教一个IPC权限问题,我创建了一个共享内存后,在shmat的时候出错,具体原因就是我不具备权限,系统输出错误为:Permission denied。
其中的要点在于;
1, 我创建共享内存的时候, 设置的权限为666,我创建内存成功,能够输出正常id,但是我用ipcs确看不到共享内存信息,在shmat的时候提示我没有权限
2, 我不是root用户,不具备管理员权限,当我切换到root用户的时候,能够看到我先前创建的共享内存(我用普通用户看不到,很奇怪),但是权限已经不是666, 而是222,也就是说我只能读
问题:
1,因为共享内存是随内核持续的,请问IPC的权限是否跟创建的用户权限有关? 哪怕你设置为666,最终IPC的权限也要根据你用户的权限来确定
2, 并不是我每次都无法创建权限为666的共享内存,也有一两次可以成功运行,但多运行两次后就失败
3,与共享内存的key没有多大关系,我换了很多key,一样无法成功,或者成功一两次
以下为代码片段,请指教
if ((shm_id = shmget(shm_key, sizeof(int), IPC_CREAT | 666)) == -1)
{
perror("Can't get shm");
return -1;
}
else
{
printf("Shm's id is %dn", shm_id);
}
if (((int)shm_addr = shmat(shm_id, NULL, 0)) == -1)
{
perror("Shm attach error");
shmctl(shm_id, IPC_RMID, NULL);
return -1;
}
其中的要点在于;
1, 我创建共享内存的时候, 设置的权限为666,我创建内存成功,能够输出正常id,但是我用ipcs确看不到共享内存信息,在shmat的时候提示我没有权限
2, 我不是root用户,不具备管理员权限,当我切换到root用户的时候,能够看到我先前创建的共享内存(我用普通用户看不到,很奇怪),但是权限已经不是666, 而是222,也就是说我只能读
问题:
1,因为共享内存是随内核持续的,请问IPC的权限是否跟创建的用户权限有关? 哪怕你设置为666,最终IPC的权限也要根据你用户的权限来确定
2, 并不是我每次都无法创建权限为666的共享内存,也有一两次可以成功运行,但多运行两次后就失败
3,与共享内存的key没有多大关系,我换了很多key,一样无法成功,或者成功一两次
以下为代码片段,请指教
if ((shm_id = shmget(shm_key, sizeof(int), IPC_CREAT | 666)) == -1)
{
perror("Can't get shm");
return -1;
}
else
{
printf("Shm's id is %dn", shm_id);
}
if (((int)shm_addr = shmat(shm_id, NULL, 0)) == -1)
{
perror("Shm attach error");
shmctl(shm_id, IPC_RMID, NULL);
return -1;
}
|
666?
0666!
0666!