Linux C:即使创建了共享参数,也会因“ Invalid Argument”而导致访问共享内存失败

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

我的此功能负责创建共享内存段。如您所见,如果此键已经存在共享内存,我会检查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(),您知道会发生什么吗?这会导致此错误吗?

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

[shmat第一个参数是shmget的返回值,您正在混合键和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;
} 
© www.soinside.com 2019 - 2024. All rights reserved.