【问题标题】:mmap offset when using a struct使用结构时的 mmap 偏移
【发布时间】:2014-12-02 20:05:10
【问题描述】:

我有这个结构:

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

任何建议将不胜感激。 `

【问题讨论】:

  • “当我再次运行循环时。”你还没有显示一个循环。你是一个循环将相同的(未声明的)数据复制到相同的字符串中。

标签: c struct shared-memory mmap lseek


【解决方案1】:

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

共享内存对象上的lseek 未指定,您的第二个mmap 导致段错误,因为您正在尝试mmap FILESIZE 字节到已分配给您但位于 sizeof(struct ip_row_t) 偏移量的 FILESIZE 内存区域,因此有效地超出了您被允许访问的内存,此外,偏移量必须是 getpagesize() 的倍数,这在这种情况下,它可能不是。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多