共享内存未授予父进程权限

问题描述 投票:0回答:1

我的 C 代码中有一个关于共享内存的问题。

我的 C 代码没有按我的预期工作:

#include "sys/ipc.h"
#include "sys/shm.h"

#include "unistd.h"
#include "sys/types.h"
#include "sys/wait.h"

#include "stdio.h"
#include "stdlib.h"

int main(){
    key_t key = ftok("shmfile.txt", 65);
    int shmid = shmget(key, sizeof(int), IPC_CREAT);
    if (fork() != 0){
        int * ptr = (int *) shmat(shmid, 0, 0); // This line returns -1
                            // This only happened
                            //  to parrent
        printf("shmid parrent = %d\n", shmid);
        perror("Error ");
        *ptr = 6;
        shmdt(ptr);
        wait(NULL);
        shmctl(shmid, IPC_RMID, NULL);
    }
    else{
        printf("shmid child = %d\n", shmid);
        int * ptr = (int *) shmat(shmid, 0, 0); // Works as expected
        printf("ptr address = %p\n", ptr);      
        shmdt(ptr);
        printf("Now child can exit normally");
    }
    return 0;
}

结果如下(gdb):

shmid parrent = 45
Error : Permission denied
shmid child = 45
ptr address = 0xffffffffffffffff
Now child can exit normally
Program received signal SIGSEGV, Segmentation fault.
0x00005555555552d0 in main () at main_2.c:20
20          *ptr = 6;

我希望父进程和子进程都能正常工作。只有子进程正常退出。我不确定父进程有什么问题。非常感谢!

更新1:父进程和子进程中的ptr始终是

(void *) -1
。我不知道如何使
shmat()
不返回该值。

更新 2:文件“shmfile.txt”与

main
可执行文件位于同一位置。

c linux shared-memory
1个回答
0
投票

您应该指定用于创建共享内存的权限。
例如使用

int shmid = shmget(key, sizeof(int), IPC_CREAT | 0666);

来自shmget的文档:

除了上述标志之外,最低有效 9 位 shmflg 指定授予所有者、组和的权限 其他的。这些位具有相同的格式和相同的含义, 作为 open(2) 的模式参数。目前,执行权限 不被系统使用。

经过此修改,您的代码即可运行。

Ideone

© www.soinside.com 2019 - 2024. All rights reserved.