在没有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创建的共享内存,是属于用户空间还是内核空间?

在没有共享内存的情况下提升进程间字符串

如何在unix环境下实现共享内存

[QNX Hypervisor 2.2用户手册]6.3 内存共享

linux共享内存和mmap的区别

共享内存之——mmap内存映射