【问题标题】:How to fix "Segmentation fault (core dumped)" when using shared memory in Linux在 Linux 中使用共享内存时如何修复“分段错误(核心转储)”
【发布时间】:2017-11-18 23:21:26
【问题描述】:

在我的完整程序中出现“分段错误”之后,我在 Linux 中使用共享内存(没有多个进程)编写了一个简单的 c 程序。

我仍然遇到同样的错误。我做错了什么?

谢谢!

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

void sys_err(char s[])
{
    perror(s);
    exit(1);
}

int main(int argc, char *argv[])
{
    int shmid, *shmptr, *ptr;

    if(shmid = shmget(IPC_PRIVATE, (10)*sizeof(int), 0666|IPC_CREAT)<0)
        sys_err("Cannot shmget");

    if((shmptr=(int*)shmat(shmid,0,0))<(int*)0)
        sys_err("Cannot shmat");

    shmptr[0]=1;    // <----- error: "Segmentation fault (core dumped)"
    //OR
    *shmptr=1;  // <----- error: "Segmentation fault (core dumped)"
    //OR
    ptr=shmptr; // <----- error: "Segmentation fault (core dumped)"
    *ptr=1;

    if(shmdt(shmptr)<0)
        sys_err("Cannot shmdt");

    shmctl(shmid,IPC_RMID,0);

    return 0;
}

【问题讨论】:

  • 我不知道这是问题所在,但这是 a 问题:当您将 shmat 的结果与 &lt; (int *) 0 进行比较时,您正在调用 实现特定的行为,可能会也可能不会。而是与-1(即== (int *) -1)比较是否相等。
  • 作为我之前评论的补充,指针本身实际上只是 unsigned 整数。我不知道 C 规范对此有何评论,但检查指针是否小于零并不是我认为有效的操作(因为根据定义,指针不能为负数)。与-1(转换为指针)的直接相等比较虽然很好。
  • 编译时出现警告,一切都会变得清晰。 shmid = shmget(...)&lt;0 没有做你认为的事情。用 '
  • 我试过了。它不起作用。谢谢!
  • 请考虑shmptr可能小于0的所有可能情况。有:0。您没有正确检查该错误。

标签: c linux segmentation-fault shared-memory coredump


【解决方案1】:

我终于找到了问题所在。 实际上很小。

在这部分:

if(shmid = shmget(IPC_PRIVATE, (10)*sizeof(int), 0666|IPC_CREAT)<0)
    sys_err("Cannot shmget");

缺少“()”来包围孔表达式,如下所示:

if((shmid = shmget(IPC_PRIVATE, (10)*sizeof(int), 0666|IPC_CREAT))<0)
    sys_err("Cannot shmget");

现在它运行了。 谢谢!

【讨论】:

    猜你喜欢
    • 2015-02-13
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    相关资源
    最近更新 更多