2013-02-22 63 views
2

我想设置s段的共享内存来容纳一个字符串数组。作为这个数组的一个例子Linux shmget()函数在c + +

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

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

shmget的(IPC_PRIVATE,整型尺寸(例如),IPC_CREAT); //我希望这创建共享存储器段

我发现这个site它说“关键参数是与相关联的访问值信号量ID“什么是信号量ID,我如何创建一个。

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

阅读手册指出,shmget()返回一个“shmid”。同样,尽管什么是shmid,它是一个int,字符串,指针,还是它是一些特殊类型,这是我确定我的共享内存段的方式吗?另外如果shmget()正在返回,我不需要将它分配给某些东西?

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

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

+0

'shmget()'返回一个'int'(http://www.kernel.org/doc/man-pages/online/pages/man2/shmget.2.html)。所以'shmid'是一个整数。 – 2013-02-23 00:14:55

回答

1

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

在你的榜样,您有:

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

你可能没有想过很辛苦关于这一点,但你觉得如何acutal字符串存储了“的std :: string”里面?我不清楚在这个特定情况下的具体细节,但是一个相当典型的实现将是这样的[这是简化的,一个真正的“类字符串”是一个使用basic_string类作为基础的模板类声明]。

class string 
{ 
    char *str; 
    int len; 
} 

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

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

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

您可以指定一个键或使用IPC_PRIVATE(这在男子页为“不幸名”进行了解释,并说:“IPC_NEW”会是一个更好coice)

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

你链接到真正该网站介绍了如何存储shmid

int shmid; 

... Several lines of code... 

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

我想,这应该足以让你开始。

+0

不知道,因为我没有测试过,但我认为有可能使用std :: string类和一个自定义分配器和/或放置新数据将其数据放入shm区域......您是否认为这是可能的? – Filipe 2013-02-27 02:59:19

+0

是的,但要注意共享内存在另一个进程中可能有不同的地址,所以如果是这样的话,那么普通的旧数据是您唯一的选择。 – 2013-02-27 11:29:46