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

共享内存IPC代码触发Segmentation fault(core dumped)问题修复求助

共享内存IPC代码段错误修复方案

问题描述

运行以下基于共享内存的IPC代码时,出现Segmentation fault (core dumped)报错:

原代码

#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>

int main(int argc, char** argv)

    key_t key = ftok("shmfile",65);

    int shmid = shmget(key,1024,0666|IPC_CREAT);

    char *str = (char*) shmat(shmid,(void*)0,0);

    printf("Write Data : ");
    scanf("%s",&str);


    printf("Data written in memory: %s\n",str);
    
    shmdt(str);

    return 0;

}

运行报错

[1]   Segmentation fault (core dumped) ./write

错误原因及修复步骤

  • 缺失main函数左大括号:原代码中int main(int argc, char** argv)后未添加左大括号{,属于语法错误,会导致编译异常,需补充。
  • scanf参数错误:scanf("%s",&str);中,str本身已是指向共享内存的char*指针,%s格式符需要传入字符串存储的起始地址(即str),而&str是取指针变量的地址(类型为char**),会导致输入的字符串覆盖str的原有值,后续访问时触发段错误,需修改为scanf("%s", str);。
  • 可选:添加错误处理:原代码未检查ftok、shmget、shmat的返回值,若系统调用失败会引发后续操作异常,建议添加错误判断增强健壮性。

修复后的完整代码

#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {
    // 生成共享内存键值
    key_t key = ftok("shmfile", 65);
    if (key == -1) {
        perror("ftok failed");
        exit(EXIT_FAILURE);
    }

    // 创建/获取共享内存段
    int shmid = shmget(key, 1024, 0666 | IPC_CREAT);
    if (shmid == -1) {
        perror("shmget failed");
        exit(EXIT_FAILURE);
    }

    // 挂载共享内存到进程地址空间
    char *str = (char*)shmat(shmid, (void*)0, 0);
    if (str == (char*)-1) {
        perror("shmat failed");
        exit(EXIT_FAILURE);
    }

    printf("Write Data : ");
    scanf("%s", str);

    printf("Data written in memory: %s\n", str);
    
    // 卸载共享内存
    shmdt(str);

    return 0;
}

额外说明

  • 运行代码前需确保当前目录存在shmfile文件(ftok依赖该文件生成键值),若不存在可执行touch shmfile创建。
  • 如需清理共享内存,可先用ipcs -m查看共享内存信息,再用ipcrm -m <shmid>删除指定共享内存段。

内容的提问来源于stack exchange,提问作者phúc trần cổng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:20:36