c – 使用fork()共享内存

c – 使用fork()共享内存,第1张

概述我已经看过我能找到的唯一一个类似的帖子了,但这不是我想要的. 基本上,我试图用分叉运行Odd-Even Sort,所以孩子跑赔率,父母跑平.这两者都需要共享vector inputValues,以及boolean排序. 以下代码没有任何失败的共享内存尝试,只是使用搜索算法的分叉的基本框架: while(!sorted){ pID = fork(); sorted = true; 我已经看过我能找到的唯一一个类似的帖子了,但这不是我想要的.

基本上,我试图用分叉运行Odd-Even Sort,所以孩子跑赔率,父母跑平.这两者都需要共享vector inputValues,以及boolean排序.

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

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;    }}

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

所以,我的要求如下:

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

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

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

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

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

总结

以上是内存溢出为你收集整理的c – 使用fork()共享内存全部内容,希望文章能够帮你解决c – 使用fork()共享内存所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1239438.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存