【问题标题】:Shared variable using mmap causing Segmentation Violation (SIGSEGV)使用 mmap 的共享变量导致分段冲突 (SIGSEGV)
【发布时间】:2014-05-04 17:16:19
【问题描述】:

当我正在用 c 编写一个学校项目时,我在使用共享内存时遇到了麻烦。出于某种原因,我的解决方案曾经有效,但现在无效(我知道,这很不科学)。

我创建一个共享变量:

int *sharedVar = mmap(NULL, sizeof(int)*7, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);

当我尝试这样使用它时:

sharedVar[0]=1;

或者这个:

sharedVar[4]=0;

我收到分段违规 (SIGSEGV) 错误消息。 我会很高兴收到您的任何建议。

编辑:strerror 说:

Bad file descriptor

这是什么意思?

解决方案:我还没有清理我的记忆。我觉得自己很傻。

【问题讨论】:

  • 必须检查 mmap 的返回值。该系统调用可能会失败。检查返回值,然后检查 errno(参见手册页)。
  • 我该怎么做?
  • 错误的文件描述符...... shm_fd 出了点问题。

标签: c posix shared-memory mmap segmentation-fault


【解决方案1】:

如果我不得不猜测,我会说你没有清理你的共享内存。这是unix系统吗?使用 ipcs 命令显示所有共享内存。如果您设置了一次 shm,然后不清理它,第二次它可能会失败,这取决于您尝试访问它的方式。

要找出错误消息的含义,首先要确定哪个系统调用返回了错误。然后,阅读 ERRORS 下的手册页,看看是什么条件导致设置该错误。

【讨论】:

  • 如果 OP 正在使用 mmap,他可能正在使用 posix 共享内存。 ipcs 仅适用于 sysV 共享内存。
猜你喜欢
  • 2020-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多