共享内存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
相关产品推荐
相关产品推荐

