首页 > 解决方案 > Linux C:访问共享内存失败并出现“无效参数”,即使它刚刚创建

问题描述

我的这个函数负责创建一个共享内存段。如您所见,我检查是否EEXIST已经存在与此密钥的共享内存。由于我使用相同的密钥定期执行程序,因此该共享内存在第一次程序执行后存在。

作为测试,我尝试之后通过shmat(). 但无论出于何种原因,它都失败了。这是控制台的输出:

Shared memory with Key 4661 already exists, continue...
Failed to obtain `Shared Memory`: Invalid argument

这是功能:

#define SHM_KEY 0x1235
int create_shrd_memory(uint64_t size) {
    const int shmid = shmget(SHM_KEY, size, IPC_CREAT | IPC_EXCL);
    if(shmid == -1) {
        if(errno == EEXIST) {
            printf("Shared memory with Key %d already exists, continue...\n", SHM_KEY);
            char *shdmem = shmat(SHM_KEY, NULL, 0);
            if(shdmem == -1) {
                fprintf(stderr, "Failed to obtain `Shared Memory`: %s\n", strerror(errno));
            }
            shmdt(shdmem);
            return SHM_KEY;
        } else {
            fprintf(stderr, "Failed to obtain Shared Memory: %s\n", strerror(errno));
            perror("shmget");
            exit(1);
        }
    }

    return shmid;
}

你知道如果我忘记了一次打电话会发生什么shmdt()吗?这会导致这个错误吗?

标签: clinuxshared-memory

解决方案


shmat第一个参数是 的返回值shmget,你正在混合 key 和 id。

你的代码应该是这样的:

int create_shrd_memory(uint64_t size) {
    int shmid = shmget(SHM_KEY, size, IPC_CREAT | IPC_EXCL);
    if(shmid == -1) {
        if(errno == EEXIST) {
            printf("Shared memory with Key %d already exists, continue...\n", SHM_KEY);

            shmid = shmget(SHM_KEY, size, 0);

            char *shdmem = shmat(shmid, NULL, 0);
            if(shdmem == -1) {
                fprintf(stderr, "Failed to obtain `Shared Memory`: %s\n", strerror(errno));
            }
            shmdt(shdmem);
            return SHM_KEY;
        } else {
            fprintf(stderr, "Failed to obtain Shared Memory: %s\n", strerror(errno));
            perror("shmget");
            exit(1);
        }
    }

    return shmid;
} 

推荐阅读