c++ - 两个进程之间的 Ubuntu 共享内存,代码不工作

标签 c++ ubuntu memory posix shared

我正在分别编写两个进程,它们应该通过共享内存进行交互,但我无法发现哪里出错了。第一个进程肯定已经创建了共享内存,如果重新编程,它也可以从共享内存中读取。

但是,第二个输出程序似乎根本无法读取它。我在两个程序中都使用 shmget 来创建内存,然后加入它。我用输入程序插入字符数组 nameArray,然后输出应该从共享内存中读取它并计算名称。

感谢任何帮助,代码如下:)

输入:

#include <iostream>
#include <sys/types.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#define SHM_KEY 982
using namespace std;

main()
{
    int shmid;
    char nameArray[] = "Bill Gates";
    unsigned length = sizeof(nameArray)/sizeof(nameArray[0]);
    shmid=shmget(SHM_KEY,256,0777|IPC_CREAT);

    if(shmid!=(-1))     /*Error checking measure to ensure shared memory creation was successful*/
    {
        char * ptr=(char *)shmat(shmid,0,0);    /*Assigns the char pointer to the start of shared memory*/

        for(int i=0; i<length;i++)      /*For every letter in the nameArray*/
        {
            ptr=(char *)shmat(shmid,0,i);
            *ptr=nameArray[i];      /*Sends the local char array to shared memory*/
        }
    }
    else    /*Displays Error message given shared memory creation failue*/
    {
        cout << "Sorry, shared memory creation failed"
    }
}       

输出:

#include <iostream>
#include <sys/types.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#define SHM_KEY 982
using namespace std;

main()
{
    int shmid;
    char nameArray[20];
    shmid=shmget(SHM_KEY,256,0777|IPC_CREAT);

    if(shmid!=(-1)) /*Error checking measure to ensure shared memory creation was successful*/
    {
        char * ptr=(char *)shmat(shmid,0,0);

        for(int i=0; i<11;i++)
        {
            cout << *((char *)shmat(shmid,0,i));
        }

    }
    else{}
}       

最佳答案

代码

    for(int i=0; i<length;i++)      /*For every letter in the nameArray*/
    {
        ptr=(char *)shmat(shmid,0,i);
        *ptr=nameArray[i];      /*Sends the local char array to shared memory*/
    }

并没有按照您认为的那样去做。每次调用 shmat 都会将 整个 共享内存段附加到另一个地址,具有不同的标志(范围从 0length;其中大部分没有意义)。

从循环中移除 shmat 调用。你真正需要的是

    for(int i=0; i<length;i++)      /*For every letter in the nameArray*/
    {
        ptr[i]=nameArray[i];      /*Sends the local char array to shared memory*/
    }

以及其他程序中的类似更改。

关于c++ - 两个进程之间的 Ubuntu 共享内存,代码不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26389623/

相关文章:

c++ - 如何从 32 位进程获取 64 位进程的可靠内存使用信息?

c++ - 以相反的顺序迭代可变模板参数

c++ - 如果变量未初始化,Visual Studio 2017 不会生成任何警告?

linux - sh\bash 脚本中的 PACKAGE 关键字到底意味着什么?

linux - ubuntu awk 如何获取最后一个用户和时间数据?

python - 为什么 Popen ('ping URL' ).communicate() 在 Windows 中有效而在 Ubuntu 中无效?

windows - 将物理内存地址映射到Windows中的用户空间应用程序

c++ - 用 C++ 设计事件机制

c++ - OpenGL:当我移动相机时,相机会向侧面倾斜

c - memcpy 的内部实现是如何工作的?