Linux C:即使刚刚创建,访问共享内存也失败并显示“无效参数" [英] Linux C: Accessing shared memory fails with `Invalid Argument` even though it was just created

查看:97
本文介绍了Linux C:即使刚刚创建,访问共享内存也失败并显示“无效参数"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的这个函数负责创建共享内存段.如您所见,我会检查 EEXIST 以防已存在具有此密钥的共享内存.由于我使用相同的密钥定期执行程序,因此该共享内存在第一个程序执行后存在.

作为测试,我尝试通过 shmat() 直接访问共享内存.但无论出于何种原因,它都失败了.这是控制台的输出:

与 Key 4661 的共享内存已经存在,继续...无法获得共享内存":参数无效

这是函数:

#define SHM_KEY 0x1235int create_shrd_memory(uint64_t 大小){const int shmid = shmget(SHM_KEY, size, IPC_CREAT | IPC_EXCL);如果(shmid == -1){如果(错误号 == EEXIST){printf("密钥为 %d 的共享内存已经存在,继续...\n", SHM_KEY);char *shdmem = shmat(SHM_KEY, NULL, 0);如果(shdmem == -1){fprintf(stderr, "无法获得`共享内存`: %s\n", strerror(errno));}shmdt(shdmem);返回 SHM_KEY;} 别的 {fprintf(stderr, "无法获得共享内存: %s\n", strerror(errno));perror("shmget");退出(1);}}返回 shmid;}

如果我忘记一次调用 shmdt(),你知道会发生什么吗?这会导致此错误吗?

解决方案

shmat 第一个参数是 shmget 的返回值,你混合了 key 和 id.

你的代码应该是这样的:

int create_shrd_memory(uint64_t size) {int shmid = shmget(SHM_KEY, size, IPC_CREAT | IPC_EXCL);如果(shmid == -1){如果(错误号 == EEXIST){printf("密钥为 %d 的共享内存已经存在,继续...\n", SHM_KEY);shmid = shmget(SHM_KEY, 大小, 0);char *shdmem = shmat(shmid, NULL, 0);如果(shdmem == -1){fprintf(stderr, "无法获得`共享内存`: %s\n", strerror(errno));}shmdt(shdmem);返回 SHM_KEY;} 别的 {fprintf(stderr, "无法获得共享内存: %s\n", strerror(errno));perror("shmget");退出(1);}}返回 shmid;}

This function of mine is responsible for creating a shared memory segment. As you can see, I check for EEXIST in case there already is a shared memory with this key. As I am executing the program regularly with the same key, this shared memory exists after the first program execution.

As a test, I try to access the shared memory directly afterwards via shmat(). But for whatever reason, it fails. This is the output of the console:

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

This is the function:

#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;
}

Do you know what happens, if I forgot one time to call shmdt()? Can this lead to this error?

解决方案

shmat first argument is the return value of shmget, you are mixing key and id.

You code should be something like:

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;
} 

这篇关于Linux C:即使刚刚创建,访问共享内存也失败并显示“无效参数"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆