You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

读取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 15:42:02