我正在分别编写两个进程,它们应该通过共享内存进行交互,但我无法发现哪里出错了。第一个进程肯定已经创建了共享内存,如果重新编程,它也可以从共享内存中读取。
但是,第二个输出程序似乎根本无法读取它。我在两个程序中都使用 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
都会将 整个 共享内存段附加到另一个地址,具有不同的标志(范围从 0
到 length
;其中大部分没有意义)。
从循环中移除 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/