在我的简单代码中:
#include <sys/shm.h>
#include <stdio.h>
int main() {
key_t key = ftok(".", 'b');
int shmid = shmget(key, 4, IPC_CREAT | 0444);
if (shmid == -1) {
perror("shmget");
return 1;
}
void* addr = shmat(shmid, NULL, 0);
if (addr == (void*) -1) {
perror("shmat");
return 1;
}
printf("success");
return 0;
}
我已经有读取权限,但我得到了“shmat:Permission denied”。
我是否有权写作?
答案 0 :(得分:3)
来自man shmat
:
如果在shmflg中指定了
SHM_RDONLY
,则附加该段以供阅读,并且该进程必须具有该段的读取权限。否则,附加段以进行读写,并且该进程必须具有该段的读写权限。
因此,在调用SHM_RDONLY
时,您需要使用0
而不是shmat()
。