【问题标题】:Shared memory with structure and int具有结构和整数的共享内存
【发布时间】:2018-11-27 13:14:31
【问题描述】:

所以我有这个问题,我想在我的共享内存中添加“一个”结构和一个 int 我想让我的“int在共享内存的第一个位置”(因为我在另一个程序中需要这个int)然后有结构 这是我的代码

int id = shmget( 0x82488, (sizeof(student)) + sizeof(int) ,IPC_CREAT | 0666 );
exit_on_error (id, "Error");

int *p = shmat(id,0,0);
exit_on_null(p,"Erro no attach");

Student *s = shmat(id,0,0);
exit_on_null (s,"Error");

现在我的问题来了,因为我有 2 个指针,我怎样才能让 int 成为第一个然后是结构,我应该只是

p[0]=100 s[1] = (new Student)

【问题讨论】:

  • 你为什么不写一个struct shared_mem { int count; Student s; }?那么你只需要一个指向这个结构的指针,你就可以访问所有的共享内存。
  • shmat 获得的内存针对所有可能的数据类型进行了对齐。前面的内存 4 字节可能与您的结构不正确对齐。
  • @WernerHenze 我不使用那个解决方案,因为我只需要那个号码一次
  • @Ventura 但是你认为这个结构的缺点是什么?拥有可用号码但不使用它的成本是多少?做两个shmat如何减少负载?

标签: c pointers shared-memory


【解决方案1】:

我会做的

int *p = shmat(id,0,0);
exit_on_null(p,"Erro no attach");

Student *s = (Student*)(void*)(p + 1);

这样s 指向下一个 int 的位置(如果它是一个 int)。

这有点棘手,但是用结构中可能的填充字节清除了所有可能的互操作问题。

例子:

+---+---+---+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
+---+---+---+---+---+---+---+---+---+---+

在这种情况下,p 指向位置 0(相对于缓冲区的开头),因此p + 1 指向位置 4(如果 int 有 32 位)。投射p + 1 的方式是让s 到这个地方,但类型为Student *

如果你想添加一个结构struct extension,你也可以这样做:

struct extension *x = (struct extension*)(void*)(s + 1);

这直接指向Struct 后面,并且再次具有正确的指针类型。

【讨论】:

  • 不太明白,但我不想s指向int,我希望能够访问内存并能够首先获得int然后是结构
  • @Ventura 但您希望它立即指向您的第一个 int,不是吗?
  • 想象我们有一个由多个对象组成的数组 array* array[0] = int array[1] = strucutre array[2] = structure 这样的问题是如何实现
  • Student *s = (Student*)(void*)(p + 1); 错误地假定 p + 1Student 对象正确对齐。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 2016-11-07
相关资源
最近更新 更多