使用mmap共享结构数组

我正在尝试创建父进程和子进程之间共享的结构数组。 我试图访问arrays数据时遇到分段错误。

我确信这个问题与我使用指针的方式有关,因为这是一个我不太满意的领域。

请注意,我删除了大部分似乎不相关的代码。

/* structure of Registration Table */ struct registrationTable{ int port; char name[MAXNAME]; int req_no; }; main() { /* the registrationTable is to be a shared memory space with each child process able to access and update. No concurrency controls are implemented. The parent process is responsible for cleaning up after the kiddies. */ struct registrationTable base_table[REG_TABLE_SIZE]; for (int i = 0; i < REG_TABLE_SIZE; i++) { base_table[i].req_no = 0; memset(base_table[i].name, '\0', MAXNAME); base_table[i].port = 0; } printf("\nMapping Shared Memory\n"); //set up shared memory space //void *mmap(void *addr, size_t length, int prot, int flags, // int fd, off_t offset); // addr = NONE, prot = PROT_NONE, flags = MAP_SHARED struct registrationTable *table = mmap(base_table, sizeof(base_table), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); while(1){ pid_t child = fork(); if (child == 0) {//is child for(int i = 0; i < REG_TABLE_SIZE; i++) { printf("\nExamining table looking for client at %s port: %d\n", packet_reg.data, clientAddr.sin_port); printf("\ntable[1].req_no: %d", ta[i].req_no); //segmentation fault on next line if (strcmp(table[i].name, packet_reg.data) == 0 && table[i].port == clientAddr.sin_port) { table[i].req_no++; } 

在mmap分配table之后,您尚未初始化该table内容。 所以它包含垃圾。 因此strcmp(table[i].name, packet_reg.data)很有可能strcmp(table[i].name, packet_reg.data)已分配的缓冲区并访问例如未分配的内存。

  1. 正确初始化表;
  2. 使用strncmp进行比较。