【问题标题】:Segmentation fault (core dumped) while trying to write integers into Shared Memory in C尝试将整数写入 C 中的共享内存时出现分段错误(核心转储)
【发布时间】:2019-02-27 03:01:37
【问题描述】:

我正在尝试在进程之间使用共享内存。我只是一步一步地实现这些功能。当我尝试向其中写入内容时,我不断收到分段错误(核心转储)。

int* ms; // Pointer for milliseconds
int* ns; // Pointer for nanoseconds

void checkArgs(int argc, char* argv[]);
void createSharedMem();
void createSharedMem()
{
    int shmid = shmget(KEY, sizeof(int)*128, IPC_CREAT |0666 );
    if(shmid < 0)
        printf("\n Error creating shared memory");
    ms = shmat(shmid, NULL,0);
    ns = shmat(shmid,NULL,0);
    *ms = 0;
    *ns = 0;
}


int main(int argc, char* argv[])
{

    checkArgs(argc,argv);
    createSharedMem();            

    *ms = 1;
    *ns = 1;

    printf("ms : %d ns : %d", *ms,*ns);

}

【问题讨论】:

  • 是的,我以为按继续后它会询问代码,但它直接发布了问题。无论如何,现在添加。 ;)
  • 根据共享内存操作,这似乎很好。并尝试执行此操作,它可以正常获取共享内存并且打印正常。 shmget() 是否成功?分段错误是否在 checkArgs() 中?放更多 printf 来检查崩溃的位置。
  • 不,发生错误,因为我添加了变量来测试数据是否正在写入共享内存。在我添加 ms 和 ns 之前,一切都很好。
  • 我刚刚发现没有创建共享内存。删除所有 ms 和 ns 分配后,我从检查中得到“创建共享内存时出错”。

标签: c linux operating-system shared-memory systems-programming


【解决方案1】:

我发现了问题。我没有使用 #define KEY 定义密钥并在 shmget() 中使用它,而是使用 key_t 创建了一个密钥变量。这解决了“无效参数”的问题

这是更新后的代码:

void createSharedMem()
{
    key_t key;
    int shmid = shmget(key, 4096, 0666 | IPC_CREAT);
    if(shmid < 0)
        perror("\n Error creating shared memory");
    ms = shmat(shmid, NULL,0);
    ns = shmat(shmid,NULL,0);
    *ms =0
    *ns=0;
    printf("%d",*ms);
}

【讨论】:

  • 这个key应该有正确的数字,并且对于写入和读取进程/线程应该是唯一的,以创建相同的共享内存id。这对于硬编码值也应该没问题。只需将 1000 作为密钥传递,它应该可以正常工作。通常这个key是使用ftok()生成的。
猜你喜欢
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多