c - 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()
吗?这会导致这个错误吗?
解决方案
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;
}
推荐阅读
- mysql - mysql 5.7 无法更新左连接视图的可更新部分
- javascript - 如何删除全屏模式?(InAppBrowser)
- unit-testing - MobileFirst 适配器和单元测试
- java - JFrame 与容器
- php - 从 JSON 解码数组检查数组键
- c++ - _ZStL8__ioinit 符号在 c++ 符号表中的用途是什么?
- java - Spring jms:listener-container concurrency 不使用参数化值
- angular - 在 Angular 2 模板中缓存表达式?
- swift - 匹配后的所有内容
- java - Jenkins jacoco 插件不遵守 pom.xml 中的包含