Linux中的shmget()函数在c ++中

时间:2013-02-22 23:56:42

标签: c++ pthreads fork shared-memory

我正在尝试设置共享内存的段以保存字符串数组。作为一个例子,这个数组

  

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

然后我尝试调用shmget,这样我就可以保留适当数量的os共享内存。

  

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

我发现这个site表示“关键参数是与信号量ID相关联的访问值”信号量ID是多少以及如何创建信号量。

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

通过指出shmget()返回“shmid”来阅读本手册。虽然什么是shmid是一个int,字符串,指针或它是一些特殊类型,这是我识别我的共享内存段的方式?另外如果shmget()返回的话我不需要将它分配给某些东西吗?

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

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

1 个答案:

答案 0 :(得分:1)

好的,在我解释所有细微的细节之前,通过共享内存共享数据时,有一点非常重要,那就是你了解你实际投入共享内存的内容。

在您的示例中,您有:

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

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

class string
{
    char *str;
    int len;
}

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

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

  

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

您可以指定密钥或使用IPC_PRIVATE(在man-page中将其解释为“不幸的名称”,并且“IPC_NEW”将是更好的coice)

  

通过指出shmget()返回“shmid”来阅读本手册。   虽然什么是shmid,但它是一个int,字符串,指针还是它   一些特殊类型,这就是我识别共享的方式   内存段?此外,如果shmget()返回,我将不需要   把它分配给什么东西?

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

int shmid;

... Several lines of code... 

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

我认为这应该足以让你入门。