使用fork()共享内存

Bef*_*all 7 c++ fork semaphore shared-memory

我已经看过我能找到的唯一一个类似的帖子了,但这不是我想要的.

基本上,我正在尝试使用分叉运行Odd-Even Sort,因此孩子运行赔率并且父母运行平均值.这两者都需要共享矢量inputValues,以及布尔排序.

以下代码没有任何失败的共享内存尝试,只是使用搜索算法的分叉的基本框架:

while(!sorted)
{
    pID = fork();
    sorted = true;
    cout << "Sort set to TRUE." << endl;

    if(pID == 0)
    {
        int num = 1;
        cout << "Child swap run" << endl;
        Swap((void *) num);
        cout << "Status: " << ((sorted) ? "SORTED" : "UNSORTED") << endl;
        exit(0);
    }
    else if(pID < 0)
    {
        cout << "Failed to fork." << endl;
        exit(1);
    }
    else
    {
        wpid = waitpid(pID, &status, waitStatus);
        int num = 0;
        cout << "Parent swap run" << endl;
        Swap((void *) num);
        cout << "Status: " << ((sorted) ? "SORTED" : "UNSORTED") << endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试了多种方法来破解这种内存共享,但找不到真正解释它如何工作,我需要什么以及最好的方法的任何一种资源.

所以,我的要求如下:

  • 父级和子级必须能够共享和操作全局向量和布尔值
  • 这必须能够在循环中运行,如图所示
  • 这必须与main()和swap()函数中使用的变量一起使用

如果您有任何提示,我将非常感谢他们.谢谢!

Jas*_*son 4

您将必须使用shmget()shmat()设置一个共享内存对象,但不幸的是,这不会是像std::vector. 换句话说,您必须在共享内存对象初始化时声明对象的整个大小。不过,该过程非常简单,因为在父级中,您将shmget()使用 IPC_CREAT 标志进行调用来创建共享内存对象并获取该对象的 ID 值。然后shmat()使用 ID 值进行调用以获取指向该对象的指针。接下来,使用默认值初始化对象。当您 fork 到子进程时,返回的指针shmat()在子进程中仍然有效,因此您可以使用相同的指针变量在父进程和子进程中共享内存。

在分叉任何子进程之前,您还需要在父进程中声明一个信号量,sem_init()并将pshared属性设置为大于 的值0。那么父进程和子进程都可以使用信号量来控制对共享内存对象的访问。

不过,请再次记住,共享内存对象不是动态对象,因此在初始化它时需要为其分配足够的空间。