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