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

2023-11-23

#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, 0); 

  printf ("shared memory attached at address %p\n", shared_memory); 

  /* Determine the segment's size. */ 

  shmctl (segment_id, IPC_STAT, &shmbuffer); 

  segment_size  =               shmbuffer.shm_segsz; 

  printf ("segment size: %d\n", 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 %p\n", shared_memory); 

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

  //printf ("%s\n", 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* 写入共享内存。

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


您正在放置vectors and strings 到共享内存中。这两个类都分配自己的内存,这些内存将在生成分配的任何进程的地址空间内分配,并且在从其他进程访问时会产生段错误。您可以尝试指定分配器来使用该共享内存,但由于在 C++03 中分配器被假定为无状态,所以我不确定这是否可能。

考虑看看 Boost.Interprocess 是如何做到的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux上编写的一个简单的C++共享内存程序:分段错误 的相关文章

随机推荐

  • 无法在清单资源中找到该报告

    我将所有水晶报表保存在一个文件夹中 VOUCHERS gt SALE gt BILLFORMATS 例如 第一个报告的位置是 VOUCHERS gt SALE gt BILLFORMATS gt BillFormat1 rpt Vegi M
  • 如何绘制按日期聚合的 pandas 数据框

    我有这个数据框 df pd DataFrame 2017 01 14 1 2017 01 14 30 2017 01 16 216 2017 02 17 23 2017 02 17 2 2017 03 19 745 2017 03 19 3
  • 下面的掩码输入问题如何解决?

    我有一个脚本来屏蔽文本框 在这里它 我还有一个脚本可以在单击按钮时动态添加文本框
  • 将国家/地区名称转换为国家/地区代码缩写 php [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 有没有办法将国家名称转换为国家代码缩写 或者一些php函数 这样当 澳大利亚 时
  • 当我尝试在驱动器中搜索时,程序抛出 NullPointerException?

    我编写了一个程序来查找文件或目录 当我尝试使用 in 搜索文件时 它工作正常目录 example java FileSearch abc txt f xyz但是当我尝试从中搜索文件时本地驱动器比程序抛出异常 java FileSearch
  • C# 迭代枚举? (索引 System.Array)

    我有以下代码 Obtain the string names of all the elements within myEnum String names Enum GetNames typeof myEnum Obtain the val
  • Swift - 是什么决定了字典集合的顺序?

    当我说顺序时 我的意思是编译器选择显示结果的顺序 我知道字典没有像数组那样的索引 我有以下字典 let groups Dictionary
  • IDisposable GC.SuppressFinalize(this) 位置

    我的代码使用默认的 IDisposable 实现模板 模式 snippet public void Dispose Dispose true GC SuppressFinalize this protected virtual void D
  • 在 OS X 上安装 GCC 4.7.1

    我正在尝试安装GCC4 7 1 在我的 Mac 上 因为我想更新LLVM GCC4 2 XCode 中给出 我已经下载了GCC4 7 1 我已经放置了gcc 4 7 1文件夹中 Downloads 然后我按照此处给出的说明进行操作 http
  • 如何尽快实现strlen

    假设您使用的是 x86 32 位系统 您的任务是尽快实现 strlen 有两个问题你需要注意 1 地址对齐 2 以机器字长 4 个字节 读取内存 找到给定字符串中的第一个对齐地址并不难 然后我们可以用这4个字节读取一次内存 并计算总长度 但
  • 这是什么? (函数(){})()[重复]

    这个问题在这里已经有答案了 可能的重复 这个 JavaScript 片段是什么意思 自动执行匿名 JavaScript 函数的括号位置 function something here lt This part right here 这到底是
  • 为什么使用静态块而不是直接初始化实例变量?

    为什么我要使用静态块 static B 10 over Integer B 10 一种相对于另一种的优点 缺点是什么 The static块允许您为属性编写更复杂的初始化逻辑 而单行初始化将您限制为单个表达式 请注意 实例属性和静态属性都存
  • 中断线程自身

    我不明白为什么线程不抛出InterruptedException当自己被打断时 我正在尝试使用以下代码片段 公共类中断测试 public static void main String args MyThread t new MyThrea
  • 如何在 django 视图中使用 python 多处理模块

    我有一个简单的函数来遍历 URL 列表 使用GET检索一些信息并更新数据库 PostgresSQL 因此 该功能运行完美 然而 一次一个地浏览每个 URL 会花费太多时间 使用 python 我可以执行以下操作来并行这些任务 from mu
  • 使用Django Rest框架序列化自定义数据类型并返回响应

    大多数关于 Django Rest Framework 的教程都解释了如何使用 Django 模型并执行 CRUD 操作 这是一个GET如果我使用 JSON 序列化程序 对用户模型的请求将以 JSON 格式返回用户对象的属性 我正在设计 D
  • 使用 HTML 属性作为 CSS 属性值 [重复]

    这个问题在这里已经有答案了 规范说 attr 函数返回元素上的属性值 用作属性中的值 如果在伪元素上使用 它将返回伪元素的原始元素上的属性值 http www w3 org TR css3 values attr 然而 这似乎不起作用 当我
  • jQuery - 表单不会使用 jQuery 提交

    进一步解决我的问题 jQuery 提交验证 最后有模式对话框 看起来表单根本不会使用 jQuery 提交 这是我的非常简化的代码
  • EFCore 对于简单的 LEFT OUTER 连接返回太多列

    我目前正在将 EFCore 1 1 预览版 与 SQL Server 结合使用 我正在做我认为是一个简单的 OUTER JOIN 之间的事情Order and OrderItem table var orders from order in
  • C 对数组的厌恶[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 在 C 的入门书籍中 经常声称指针或多或少are数组 这充其量不是一个巨大的简化吗 There isC 中的数组类型 它的行为与指针完全不同 例如 include
  • linux上编写的一个简单的C++共享内存程序:分段错误

    include