在没有root权限的情况下实现共享内存

时间:2014-09-30 11:54:53

标签: c linux ipc shared-memory

我有以下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

1 个答案:

答案 0 :(得分:5)

您可以为您创建的共享内存段授予权限。默认情况下,只允许root访问,但您可以在创建共享内存段时更改此值,例如:

shmid = shmget(key, SHMSZ, IPC_CREAT | 0666); 
//or
shmid = shmget(key, SHMSZ, IPC_CREAT | 0777);

然后您可以尝试以任何用户身份访问此共享内存段。