我有这个结构:
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
任何建议都将不胜感激。 `
答案 0 :(得分:1)
你应该在struct ip_row *data;
上使用指针算法来进一步"进一步"在你的mmaped共享内存中,因为mmap只返回指向FILESIZE
内存区域的指针,该内存区域恰好被镜像到共享内存中。
例如,使用data[0]
访问第一个副本,data[1]
访问第二个副本等。
未指定共享内存对象上的lseek
,并且您的第二个mmap
会导致段错误,因为您尝试mmap
FILESIZE
个字节到已分配的FILESIZE
内存区域对你而言,sizeof(struct ip_row_t)
偏移量,因此有效地超出了你可以访问的内存,此外,偏移量必须是getpagesize()
的倍数,在这种情况下它可能不是。{/ p >