Implementing shared memory without root privileges

I have the following C program

#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");                                                                     

}

      

when executed without root privileges, I get

meow@darkArts ~/Arena/c $ gcc shm.c && ./a.out 
SHMKEY: Success
SHMGET: Success
SHMAT: Permission denied

      

And when executed by root user I get the following message

root@darkArts:/home/meow/Arena/c# gcc shm.c && ./a.out
SHMKEY: Success
SHMGET: Success
SHMAT: Success

      

Is it possible to associate shared memory with my non-root address space?

EDIT:

C shmid = shmget(key, SHMSZ, IPC_CREAT | 0666);

and shmid = shmget(key, SHMSZ, IPC_CREAT | 0777);

I get
meow@darkArts ~/Arena/c $ gcc shm.c && ./a.out 
SHMKEY: Success
SHMGET: Permission denied
SHMAT: Invalid argument

      

+3


source to share


1 answer


You can grant permissions to the shared memory segment that you create. By default, only root is allowed, but you can change this when creating the shared memory segment, for example:

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

      



Then you can try to access that shared memory segment as any user.

+4


source







All Articles