c++中的Linux shmget()函数
Linux shmget() function in c++
我正在尝试设置共享内存的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) {
我认为这应该足以让你开始。
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- c++中的Linux shmget()函数