在没有root权限的情况下实现共享内存
Posted
技术标签:
【中文标题】在没有root权限的情况下实现共享内存【英文标题】:Implementing shared memory without root privilege 【发布时间】:2014-09-30 11:54:52 【问题描述】:我有以下 C 程序
#include <stdio.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <sys/ipc.h>
int main()
key_t shm_key;
int shm_flag,shm_id,shm_size;
void *shm_addr;
shm_key = ftok("/home/meow/Arena",22);
perror("SHMKEY");
shm_id = shmget(shm_key,sizeof(int)*20,IPC_CREAT);
perror("SHMGET");
shm_addr = shmat(shm_id,NULL,0);
perror("SHMAT");
当没有root权限执行时我得到
meow@darkArts ~/Arena/c $ gcc shm.c && ./a.out
SHMKEY: Success
SHMGET: Success
SHMAT: Permission denied
当由 root 用户执行时,我收到以下消息
root@darkArts:/home/meow/Arena/c# gcc shm.c && ./a.out
SHMKEY: Success
SHMGET: Success
SHMAT: Success
是否可以在没有root权限的情况下将共享内存绑定到我的地址空间?
编辑:
使用shmid = shmget(key, SHMSZ, IPC_CREAT | 0666);
和shmid = shmget(key, SHMSZ, IPC_CREAT | 0777);
我得到
meow@darkArts ~/Arena/c $ gcc shm.c && ./a.out
SHMKEY: Success
SHMGET: Permission denied
SHMAT: Invalid argument
【问题讨论】:
仅在函数指示失败时调用perror()
。
相关:***.com/questions/19075589/…
您考虑过使用 Posix 共享内存吗?见shm_overview(7)
【参考方案1】:
您可以授予您创建的共享内存段的权限。默认情况下,只允许 root 访问,但您可以在创建共享内存段时更改此设置,例如:
shmid = shmget(key, SHMSZ, IPC_CREAT | 0666);
//or
shmid = shmget(key, SHMSZ, IPC_CREAT | 0777);
然后您可以尝试以任何用户身份访问此共享内存段。
【讨论】:
以上是关于在没有root权限的情况下实现共享内存的主要内容,如果未能解决你的问题,请参考以下文章
linux下通过shmget创建的共享内存,是属于用户空间还是内核空间?