尝试通过共享内存指针赋值时触发段错误的问题求助
问题分析与解决方案
核心原因:函数声明缺失导致指针类型错误
你遇到的段错误,最可能的原因是shmlib.h中缺少attachToMemory()函数的正确声明,导致编译器对返回值类型判断错误:
- 在访问进程中,如果没有显式声明
attachToMemory()返回char*,编译器会隐式将其视为返回int的函数。 - 64位系统中,
int是32位长度,而char*是64位长度,这会导致shmat返回的有效64位指针被截断为32位,赋值给char*后变成无效地址,读写时直接触发段错误。 - 这种情况下
shmat本身执行成功(errno为0),但最终得到的指针是无效的,完全符合你的描述。
修复步骤
- 完善
shmlib.h的函数声明,确保类型匹配:
#ifndef SHMLIB_H #define SHMLIB_H #include <sys/types.h> // 显式声明函数的返回值和参数 int getMemoryBlock(); char *attachToMemory(); #endif
- 编译时开启警告(如
gcc -Wall),这类隐式声明的问题会被编译器直接提示,便于提前排查。
额外验证与优化建议
- 使用
ipcs -m命令查看共享内存状态,确认:- 创建进程运行后,对应
shmid的共享内存存在,shm_nattch(连接数)为0; - 访问进程执行
attachToMemory()后,shm_nattch变为1,说明挂载成功。
- 创建进程运行后,对应
- 创建进程可以额外执行一次挂载再分离,确保共享内存页被内核初始化(非必须,但能避免部分潜在问题):
// 在创建进程的main函数中添加 char *tmp = shmat(shmid, NULL, 0); if (tmp != (char*)-1) { shmdt(tmp); }
内容的提问来源于stack exchange,提问作者Dilan Moya
相关产品推荐
相关产品推荐

