IPC linux中数组存储的分段错误
Posted
技术标签:
【中文标题】IPC linux中数组存储的分段错误【英文标题】:Segmentation fault in array storing in IPC linux 【发布时间】:2019-03-05 05:16:55 【问题描述】:我正在尝试将一个数组存储在一个进程的共享中,并试图从另一个进程访问该数组。
下面是我用来存储数组的代码
#include <iostream>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int count;
int main()
while(1)
int arr[5] = 1,2,3,4,5;
int *str1;
int key=5678;
// shmget returns an identifier in shmid
int shmid = shmget(key,1024, 0666|IPC_CREAT);
printf("\nShared Memory Id = %d\n",shmid);
// shmat to attach to shared memory
str1 = (int*) shmat(shmid,(void*)0,0);
for(int i=0;i<5;i++)
*str1=arr[i];
printf("Data written in memory: %d\n",*str1);
str1++;
shmdt((void*)str);
return 0;
当我运行该程序时,它会在一定程度上运行并给出错误作为分段错误(核心转储)并退出应用程序。
请帮我解决这个问题。
感谢和问候, 普拉巴卡尔 M
【问题讨论】:
我建议一些rubber duck debugging。密切注意循环后str1
指向的位置...
并且总是检查错误!
另外,如果您希望人们阅读您的代码,请保持一致的格式。此外,提取minimal reproducible example。奇怪的是,您自己这样做会偶然发现错误。
我已经尝试了所有的方法我没有得到它。请帮忙整理一下。
请edit你的问题告诉我们你做了什么样的调试。我希望您已经在 Valgrind 或类似的检查器中运行了您的minimal reproducible example,并使用诸如 GDB 之类的调试器进行了调查。确保您也启用了全套编译器警告。这些工具告诉了你什么,它们缺少什么信息?并阅读 Eric Lippert 的 How to debug small programs。
【参考方案1】:
str1++ 是罪魁祸首。 下面的代码正在运行。
#include <iostream>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int count;
int main()
int arr[5] = 1,2,3,4,5;
int *str1;
int key=5678;
// shmget returns an identifier in shmid
int shmid = shmget(key,1024, 0666|IPC_CREAT);
printf("\nShared Memory Id = %d\n",shmid);
// shmat to attach to shared memory
str1 = (int*) shmat(shmid,(void*)0,0);
int *copyAdrr;
copyAdrr = str1 ;
while(1)
for(int i=0;i<5;i++)
*str1=arr[i];
printf("Data written in memory: %d\n",*str1);
str1++;
str1 =copyAdrr;
shmdt((void*)str);
return 0;
【讨论】:
以上是关于IPC linux中数组存储的分段错误的主要内容,如果未能解决你的问题,请参考以下文章