shmat()即使我有读访问权限也被拒绝

时间:2017-07-13 08:15:47

标签: c linux shared-memory

在我的简单代码中:

#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”。

我是否有权写作?

1 个答案:

答案 0 :(得分:3)

来自man shmat

  

如果在shmflg中指定了SHM_RDONLY,则附加该段以供阅读,并且该进程必须具有该段的读取权限。否则,附加段以进行读写,并且该进程必须具有该段的读写权限。

因此,在调用SHM_RDONLY时,您需要使用0而不是shmat()