c++中的Linux shmget()函数

Linux shmget() function in c++

本文关键字:函数 shmget 中的 Linux c++      更新时间:2023-10-16

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

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

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

shmget(IPC_PRIVATE,sizeOf(示例),IPC_CREAT)//我希望这能创建共享内存段

我发现了这个网站,上面写着"关键参数是与信号量ID相关的访问值"什么是信号量ID以及我如何创建信号量ID。

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

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

如果你能推荐一个教程或概述,我将非常感谢。除了上面的具体问题外,我还想举一个从将通过fork()命令创建的线程访问共享内存的例子。

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

好吧,在我解释所有次要细节之前,通过共享内存共享数据时,有一件事非常重要,那就是你要了解你实际在共享内存中投入了什么。

在您的示例中,您有:

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

您可能没有仔细考虑过这一点,但您认为实际字符串是如何存储在"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"将是一个更好的名称)

仔细阅读手册指出,shmget()返回一个"shmid"。同样,shmid是int、字符串、指针还是某种特殊类型的,那么这就是我识别我的共享内存段?此外,如果shmget()正在返回一些我不需要的东西把它分配给什么?

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

int shmid;
... Several lines of code... 
if ((shmid = shmget(key, SHMSZ, IPC_CREAT | 0666)) < 0) {

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