读取mmap存储值时出现Segmentation Fault段错误的修复方案求助
问题原因与修复方案
你遇到的段错误由多个代码缺陷共同导致,逐一排查修复即可:
- 核心问题1:子进程执行完逻辑后未主动退出
当前代码中子进程完成计算写入results[i]后,没有调用exit()终止进程,会继续执行后续所有代码:包括继续循环创建更多子进程、甚至执行后续的results数组遍历逻辑,多个进程同时操作共享内存+逻辑混乱最终触发非法内存访问。 - 核心问题2:代码块括号配对错误
你贴出的代码中,子进程的逻辑块括号明显配对错误:if (pid == 0)的闭合括号位置不对,导致写入results[i]的逻辑可能根本不在子进程作用域内,甚至父进程的逻辑也被括号错误截断,执行流程完全不符合预期。 - 潜在问题:未校验
mmap的返回值
如果count值非法(比如为0、负数),或者系统内存不足,mmap会返回MAP_FAILED(也就是(void*)-1),你直接把这个返回值当成正常指针访问,必然触发段错误。
修复后的参考代码
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/mman.h> #include <sys/wait.h> int main() { // 替换为你实际的count值,确保是正整数 int count = 5; // 先校验count合法性 if (count <= 0) { perror("count必须为正整数"); return 1; } int *results = mmap(NULL, count * sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); // 必须校验mmap返回值 if (results == MAP_FAILED) { perror("mmap申请失败"); return 1; } for (int i = 0; i < count; i++) { pid_t pid = fork(); if (pid == 0) { // 子进程内执行相关计算,这里用示例值替换你的calculation int calculation = i * 10; // 将结果保存到mmap的第i个元素 results[i] = calculation; // 子进程完成任务后必须主动退出,不要继续执行后续逻辑 exit(0); } else if (pid < 0) { perror("fork失败"); munmap(results, count * sizeof(int)); return 1; } else { wait(NULL); } } // 遍历输出结果 for (int i = 0; i < count; i++) { printf("results[%d] = %d.\n", i, results[i]); } // 最后释放共享内存 munmap(results, count * sizeof(int)); return 0; }
补充说明
MAP_ANONYMOUS对应的文件描述符参数在不同系统下要求不同,Linux下推荐传-1而不是0,兼容性更好;如果你的count值很大,需要确认系统允许的匿名映射上限是否满足需求。
内容的提问来源于stack exchange,提问作者user16438868
相关产品推荐
相关产品推荐

