2

我正在尝试设置共享内存的 s 段来保存字符串数组。例如这个数组

string example[] = {"This is", "An Example", "of strings"};

然后我尝试调用 shmget 以便我可以保留适当数量的操作系统共享内存。

shmget(IPC_PRIVATE, sizeOf(example), IPC_CREAT);//我希望这会创建共享内存段

我发现这个网站说“关键参数是与信号量 ID 关联的访问值”什么信号量 ID 以及如何创建一个。

这使用 g++ -Wall 编译,但我不知道如何检查它是否有。根据 IPC_PRIVATE 所在的 linux 中的 shm 手册,我应该指定“key_t”类型的内容。我的想法是我如何识别共享内存的关键,即指定一个字符串作为共享内存名称或指定一个 ID 号。

阅读手册指出 shmget() 返回一个“shmid”。同样,虽然什么是 shmid,它是 int、string、pointer 还是某种特殊类型,这就是我识别共享内存段的方式吗?另外,如果 shmget() 正在返回某些东西,我不需要将其分配给某些东西吗?

如果您能推荐一个教程或概述,我将不胜感激。除了上面的具体问题,我想要一个从将由 fork() 命令创建的线程访问共享内存的示例。

我的最终目标是为数组中的每个字符串生成一个线程,该线程将执行某种反转。这只是开始使用共享内存和 pthreads 的一个小任务,因为我还没有找到一个教程来完成。

4

1 回答 1

1

好的,在我解释所有次要细节之前,通过共享内存共享数据时非常重要的一件事是您了解您实际放入共享内存的内容。

在您的示例中,您有:

string example[] = {"This is", "An Example ", "of strings"};

您可能没有认真考虑过这一点,但是您认为实际字符串如何存储在“std::string”中?我不知道这种特殊情况下的确切细节,但一个相当典型的实现是这样的[这是简化的,真正的“类字符串”是使用basic_string类作为基础的模板类声明]。

class string
{
    char *str;
    int len;
}

因此,如果您复制example到共享内存中,那么您将在共享内存中拥有三个指针和三个整数。这些指针指向一些几乎可以肯定不在共享内存中的内存......显然,“其他进程”中的内存地址不会是你所期望的[好吧,至少如果字符串不是常量并且你的进程在创建字符串之前被分叉 - 但如果字符串是恒定的和/或在分叉发生时已经存在,那么您真的不需要共享内存,对吗?]

对此的典型解决方案是仅将数据存储在“普通旧数据”的共享内存中(因此没有包含成员函数或指针的对象)。实现此目的的一种方法是“序列化”数据 - 如果您想将数据存储在文件中,您会做同样的事情。

这使用 g++ -Wall 编译,但我不知道如何检查它是否有。根据 IPC_PRIVATE 所在的 linux 中的 shm 手册,我应该指定“key_t”类型的内容。我的想法是我如何识别共享内存的关键,即指定一个字符串作为共享内存名称或指定一个 ID 号。

您可以指定一个密钥或使用 IPC_PRIVATE(在手册页中被解释为“不幸的名称”,而“IPC_NEW”将是一个更好的选择)

阅读手册指出 shmget() 返回一个“shmid”。同样,虽然什么是 shmid,它是 int、string、pointer 还是某种特殊类型,这就是我识别共享内存段的方式吗?另外,如果 shmget() 正在返回某些东西,我不需要将其分配给某些东西吗?

您链接到的站点实际上解释了如何存储shmid

int shmid;

... Several lines of code... 

if ((shmid = shmget(key, SHMSZ, IPC_CREAT | 0666)) < 0) {

我认为这应该足以让你开始。

于 2013-02-23T00:53:29.657 回答