2014-12-02 93 views
0

我有这个结构时偏移:MMAP使用结构

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; 

我想多次使用该结构在共享内存file.I已经验证了整整一个应用,它的工作原理。

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

“当我再次运行循环。”你没有显示一个循环。你说的*是一个循环将相同的(未声明的)数据复制到相同的字符串中。 – 2014-12-02 20:40:55

回答

1

您应该使用在struct ip_row *data;指针运算,以达到您的mmaped共享内存“进一步”,因为MMAP只是一个指针返回的FILESIZE的存储区域,这恰好被镜像到共享内存中。
例如使用data[0]访问第一个副本,访问第二等

lseek共享内存对象是不确定的和你的第二个原因mmap因为段错误您试图mmapFILESIZE字节已分配的内存FILESIZE区域给你,但在sizeof(struct ip_row_t)偏移量,因此有效地超出你允许访问的内存,此外,偏移量必须是getpagesize()的倍数,在这种情况下,它可能不是。