Linux C:即使刚刚创建,访问共享内存也失败并显示“无效参数" [英] Linux C: Accessing shared memory fails with `Invalid Argument` even though it was just created
问题描述
我的这个函数负责创建共享内存段.如您所见,我会检查 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屋!