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

vik*_*cks 3 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");                                                                     

}
Run Code Online (Sandbox Code Playgroud)

当没有root权限执行时

meow@darkArts ~/Arena/c $ gcc shm.c && ./a.out 
SHMKEY: Success
SHMGET: Success
SHMAT: Permission denied
Run Code Online (Sandbox Code Playgroud)

当由root用户执行时,我得到以下消息

root@darkArts:/home/meow/Arena/c# gcc shm.c && ./a.out
SHMKEY: Success
SHMGET: Success
SHMAT: Success
Run Code Online (Sandbox Code Playgroud)

是否可以在没有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
Run Code Online (Sandbox Code Playgroud)

小智 5

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

shmid = shmget(key, SHMSZ, IPC_CREAT | 0666); 
//or
shmid = shmget(key, SHMSZ, IPC_CREAT | 0777);
Run Code Online (Sandbox Code Playgroud)

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