LinuxC:访问共享内存时有失败
今天我已经开始了一个话题: 但不幸的是,这个问题的答案并没有完全解决我的问题 我仍在使用此功能:LinuxC:访问共享内存时有失败,linux,shared-memory,Linux,Shared Memory,今天我已经开始了一个话题: 但不幸的是,这个问题的答案并没有完全解决我的问题 我仍在使用此功能: #define SHM_KEY 0x1237 int create_shrd_memory(uint64_t size) { int shmid = shmget(SHM_KEY, size, IPC_CREAT | IPC_EXCL); if(shmid == -1) { if(errno == EEXIST) { printf("Share
#define SHM_KEY 0x1237
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, try to access it...\n", SHM_KEY);
while((shmid = shmget(SHM_KEY, size, 0)) < 0) {
fprintf(stderr, "Error access shared mem: %s\n", strerror(errno));
}
char *shdmem = shmat(shmid, NULL, 0);
if(shdmem == -1) {
fprintf(stderr, "Failed to obtain `Shared Memory` with id %d: %s\n", shmid, strerror(errno));
return 0;
}
printf("Successfully accessed shared memory with id: %d!\n", shmid);
shmdt(shdmem);
} else {
fprintf(stderr, "Failed to obtain Shared Memory: %s\n", strerror(errno));
perror("shmget");
exit(1);
}
}
return shmid;
}
整个操作运行正常,但在我的“分发程序”启动三到四次后,共享内存就无法再访问了(while循环永远不会返回,这意味着shmget
总是返回一个错误:error access shared mem:Invalid argument
)
如果我将SHM_KEY更改为不同的值,编译并启动-一切都会再次正常工作(对于三次或四次程序执行)。顺便说一句,运行期间没有问题
我通过
CTRL+C
取消程序执行。我的想法是,由于突然中断,子进程并不总是能够调用shmdt()
。这会导致上述问题吗?至少有两个原因shmget
返回EINVAL
。感兴趣的我不明白为什么这两个理由中的任何一个适用于我的情况。为什么记忆会突然变小?如果小于SHMMIN
或大于SHMAX
是真的,我的猜测是,我本来就无法创建共享内存?为什么内存会突然比以前小?可能是因为uint64\u t size
不是编译时常量,并且您没有显示它的来源。贴一张。请尝试使用strace
运行您的应用程序,并注意shmget
参数。还可以使用ipcs
查看您从未释放共享内存。至少有两个原因shmget
返回EINVAL
。感兴趣的我不明白为什么这两个理由中的任何一个适用于我的情况。为什么记忆会突然变小?如果小于SHMMIN
或大于SHMAX
是真的,我的猜测是,我本来就无法创建共享内存?为什么内存会突然比以前小?可能是因为uint64\u t size
不是编译时常量,并且您没有显示它的来源。贴一张。尝试使用strace
运行应用程序,并注意shmget
参数。还可以使用ipcs
查看您是否从未释放共享内存。
void print_statistics(const int amnt_of_processes, int shmid) {
uint8_t *shmd = shmat(shmid, NULL, 0);
if(shmd == -1) {
fprintf(stderr, "Failed to obtain `Shared Memory` with id: %d during statistics: %s\n", shmid, strerror(errno));
return;
}
printf("STATISTICS:\n");
for(uint8_t i = 0; i < amnt_of_processes; i++) {
printf("\tPROCESS %d\n", i);
struct stats_record *stats = (struct stats_record*)(shmd + sizeof(struct stats_record) * i);
printf("\t->REC PACKETS: %lu\n", stats->rx_packets);
printf("\t->LOST PACKETS: %lu\n", stats->rtp_nmbr_drpd_pckts);
printf("\t->Gbit/s: %0.2f\n", (stats->bps / 1024.0));
}
}