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中数组存储的分段错误的主要内容,如果未能解决你的问题,请参考以下文章

通过共享内存和管道的 IPC 给出分段错误:C 中的 11

指针数组的分段错误

指针数组 C++ 的分段错误

大型二维数组给出分段错误

分段错误(核心转储)c

动态二维数组。为啥是分段错误?