![shmat 在启用 selinux 的 rhel 环境中返回错误 (void *) -1](https://linux22.com/image/198125/shmat%20%E5%9C%A8%E5%90%AF%E7%94%A8%20selinux%20%E7%9A%84%20rhel%20%E7%8E%AF%E5%A2%83%E4%B8%AD%E8%BF%94%E5%9B%9E%E9%94%99%E8%AF%AF%20(void%20*)%20-1.png)
根据文件:-
如果在 shmflg 中指定了 SHM_RDONLY,则附加该段以供读取,并且进程必须具有该段的读取权限。否则,该段将被附加以进行读取和写入,并且进程必须具有该段的读取和写入权限。不存在只写共享内存段的概念。
所以这里我传递 0,根据上面的语句将提供共享内存的读写访问权限。
ipcs 输出:-
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x5304f6ab 98307 root 666 64 1
附加到memroy的C++代码
//Get shared memory for given shm_id
uint8_t* mem = (uint8_t *) shmat(_shm_id, NULL, 0);
if ((void *) mem == (void *) -1){
// in selinux enable system I am keep on coming here, mem is alway 0XFFFFFFF..
return -1;
}
奇怪的是,当我在 shmat 函数中传递 SHM_RDONLY 标志时,我得到了正确的共享内存位置,即使共享内存的权限是读写。
这里唯一的区别是内存是由 root 创建的并读取其他用户(如 user1),但由于给出了 666 权限,我不认为这可能是一个问题,不确定 selinux 是否在这里引起了一些问题。