当前位置: 首页 > 知识库问答 >
问题:

C++中的Linux shmget()函数

张敏达
2023-03-14

我正在尝试设置共享内存段以容纳字符串数组。例如,以下数组

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

然后,我尝试调用shmget,以便获得预留适当数量的os共享内存。

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

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

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

共有1个答案

巩衡
2023-03-14

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

在您的示例中,您有:

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是),我应该指定类型为“key_t”的内容。我的想法是,关键在于如何标识共享内存,即指定一个字符串作为共享内存名,或者指定一个id号。

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

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

int shmid;

... Several lines of code... 

if ((shmid = shmget(key, SHMSZ, IPC_CREAT | 0666)) < 0) {
 类似资料:
  • 本文向大家介绍C / C ++中的mbsrtowcs()函数,包括了C / C ++中的mbsrtowcs()函数的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将讨论C ++ STL中std::mbsrtowcs()函数的工作,语法和示例。 什么是std::mbsrtowcs()? std::mbsrtowcs()函数是C ++ STL中的内置函数,在<cwchar>头文件中定义。表示将

  • 本文向大家介绍C / C ++中的putwchar()函数,包括了C / C ++中的putwchar()函数的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将讨论C ++ STL中putwchar()函数的工作,语法和示例。 什么是putwchar()? putwchar()函数是C ++ STL中的内置函数,在<cwchar>头文件中定义。putwchar()函数用于在标准输出设备上写

  • 本文向大家介绍C ++中的div()函数,包括了C ++中的div()函数的使用技巧和注意事项,需要的朋友参考一下 C / C ++库函数div_t div(int numer,int denom)将numer(分子)除以denom(分母)。下面是div()函数的声明。 参数是分子和分母。此函数以<cstdlib>定义的结构返回该值,该结构具有两个成员。对于div_t:int quot; 诠释 示

  • 在下面的代码中,一旦我删除了比较字符串的注释部分,我就会出现seg 11错误。我无法理解为什么!其余代码运行良好。感谢任何帮助!

  • 本文向大家介绍C / C ++程序中的mbrtowc()函数,包括了C / C ++程序中的mbrtowc()函数的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将讨论C ++ STL中std::mbrtowc()函数的工作,语法和示例。 什么是std::mbrtowc()? std::mbrtowc()函数是C ++ STL中的内置函数,在<cwchar>头文件中定义。mbrtowc()

  • 本文向大家介绍C++中的六个函数,包括了C++中的六个函数的使用技巧和注意事项,需要的朋友参考一下 一、构造函数    在C++中,构造函数是六个函数中的第一个,当一个对象被创建时,在它的整个周期中,是一个由生到死的过程,即构造函数创建对象,析构函数析构对象。在对象被创建时,调用构造函数创建一个对象,这是对象的创建过程。在C++中,当你创建一个对象时需要调用构造函数创建对象,在类中,有默认的构造函

  • 本文向大家介绍C ++ STL中的iswdigit()函数,包括了C ++ STL中的iswdigit()函数的使用技巧和注意事项,需要的朋友参考一下 在C ++ STL中,function是一个内置函数,用于检查给定的宽字符是十进制数字字符还是其他字符。此函数存在于C / C ++的cwctype头文件中。 什么是十进制数字字符? 小数位字符是从0开始的数值,即0、1、2、3、4、5、6、7、8

  • 本文向大家介绍C ++ STL中的iswxdigit()函数,包括了C ++ STL中的iswxdigit()函数的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将讨论C ++中的iswxdigit()函数,其语法,工作原理及其返回值。 iswxdigit()函数是C ++中的内置函数,在头文件中定义。该函数检查传递的宽字符是否为十六进制字符。该函数检查传递的参数是否为十六进制字符,然后返