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

尝试通过共享内存指针赋值时触发段错误的问题求助

问题分析与解决方案

核心原因:函数声明缺失导致指针类型错误

你遇到的段错误,最可能的原因是shmlib.h中缺少attachToMemory()函数的正确声明,导致编译器对返回值类型判断错误:

  • 在访问进程中,如果没有显式声明attachToMemory()返回char*,编译器会隐式将其视为返回int的函数。
  • 64位系统中,int是32位长度,而char*是64位长度,这会导致shmat返回的有效64位指针被截断为32位,赋值给char*后变成无效地址,读写时直接触发段错误。
  • 这种情况下shmat本身执行成功(errno为0),但最终得到的指针是无效的,完全符合你的描述。

修复步骤

  1. 完善shmlib.h的函数声明,确保类型匹配:
#ifndef SHMLIB_H
#define SHMLIB_H

#include <sys/types.h>

// 显式声明函数的返回值和参数
int getMemoryBlock();
char *attachToMemory();

#endif
  1. 编译时开启警告(如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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:23:14