加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

一个简单的C共享内存程序写在linux上:分段错误

发布时间:2020-12-16 03:32:55 所属栏目:百科 来源:网络整理
导读:#include stdio.h #include sys/shm.h #include sys/stat.h #include string#include vector#include iostreamusing namespace std;struct LOCK { string name; string type; vector string pids;};int main () { int segment_id; LOCK* shared_memory; stru
#include <stdio.h> 
#include <sys/shm.h> 
#include <sys/stat.h> 
#include <string>
#include <vector>
#include <iostream>

using namespace std;

struct LOCK {
  string name;
  string type;
  vector <string> pids;
};

int main () 

{

  int segment_id; 

  LOCK* shared_memory; 

  struct shmid_ds shmbuffer; 

  int segment_size; 

  const int shared_segment_size = 0x6400; 



  /* Allocate a shared memory segment.  */ 

  segment_id = shmget (IPC_PRIVATE,shared_segment_size,IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR); 

  /* Attach the shared memory segment.  */ 

  shared_memory = (LOCK*) shmat (segment_id,0); 

  printf ("shared memory attached at address %pn",shared_memory); 

  /* Determine the segment's size. */ 

  shmctl (segment_id,IPC_STAT,&shmbuffer); 

  segment_size  =               shmbuffer.shm_segsz; 

  printf ("segment size: %dn",segment_size); 

  /* Write a string to the shared memory segment.  */ 

  //sprintf (shared_memory,"Hello,world."); 
  shared_memory -> name = "task 1";
  shared_memory -> type = "read";
  (shared_memory -> pids).push_back("12345");
  (shared_memory -> pids).push_back("67890");

  /* Detach the shared memory segment.  */ 

  shmdt (shared_memory); 



  /* Reattach the shared memory segment,at a different address.  */ 

  shared_memory = (LOCK*) shmat (segment_id,(void*) 0x5000000,0); 

  printf ("shared memory reattached at address %pn",shared_memory); 

  /* Print out the string from shared memory.  */ 

  //printf ("%sn",shared_memory -> name); 
  cout << "Name of the shared memory: " + shared_memory -> name << endl;

  /* Detach the shared memory segment.  */ 

  shmdt (shared_memory); 



  /* Deallocate the shared memory segment.  */ 

  shmctl (segment_id,IPC_RMID,0); 



  return 0; 

}

我从共享内存教程中获取了代码.它一直工作,直到我定义了struct LOCK并尝试将LOCK而不是char *写入共享内存.

有人可以帮我解决导致分段错误的问题吗?

解决方法

您将向量和字符串放入共享内存中.这两个类都分配自己的内存,这些内存将在任何进程生成分配的地址空间内分配,并在从其他进程访问时产生段错误.您可以尝试指定分配器使用该共享内存,但由于在C 03中,分配器被假定为无状态,我不确定它是否可行.

考虑一下Boost.Interprocess是如何做到的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读