gpt4 book ai didi

c - 使用结构时的 mmap 偏移量

转载 作者:行者123 更新时间:2023-11-30 15:26:54 25 4
gpt4 key购买 nike

我有这个结构:

typedef struct ip_row {
sem_t row_lock;
char row_name[NAME_SIZE];
char row_address4[NAME_SIZE]; // IPv4 address name
char row_address6[NAME_SIZE]; // IPv6 address name
} ip_row_t;

我想在共享内存文件中多次使用该结构。我已经验证过,对于一次使用,它是有效的。

int shmfd; //Shared memory file descriptor
struct ip_row *data;

/*...creating shared memory and map...*/
shmfd = shm_open(shared_memory, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR | S_IRGRP );
ftruncate(shmfd,FILESIZE);
data = (ip_row_t*)mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, shmfd,0);

/*...getting to user inputs, this stuff is in a loop...*/
strcpy(data->row_name,ipstr1);
strcpy(data->row_address6,ipstr2);
strcpy(data->row_address4,ipstr3);

当我再次运行循环时,写入从共享内存文件的开头开始,覆盖之前的内容。如何移动偏移量以便支持共享内存中的更多条目?我已经尝试过这两个:

lseek(shmfd,sizeof(struct ip_row_t),SEEK_CUR); //segfault when we write agian
data = (ip_row_t*)mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, shmfd,sizeof(struct ip_row_t)); //also segfaults when we try to read

如有任何建议,我们将不胜感激。`

最佳答案

您应该在 struct ip_row *data; 上使用指针算术来到达 mmaped 共享内存中的“更远”位置,因为 mmap 只返回一个指向 FILESIZE 内存区域的指针>,它恰好被镜像到共享内存中。
例如,使用 data[0] 访问第一个副本,使用 data[1] 访问第二个副本等。

共享内存对象上的 lseek 未指定,并且您的第二个 mmap 会导致段错误,因为您试图将 mmap FILESIZE 字节已分配给您的 FILESIZE 内存区域,但具有 sizeof(struct ip_row_t) 偏移量,因此有效地超出了您允许访问的内存范围,此外,偏移量具有是 getpagesize() 的倍数,在本例中可能不是。

关于c - 使用结构时的 mmap 偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27257947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com