2014-12-02 41 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()的倍數,在這種情況下,它可能不是。