我分别编写了两个进程,这些进程应该通过共享内存进行交互,但我无法发现我要去哪里。第一个过程肯定创建了共享内存,如果重新编程,它也可以从共享内存中读取。
但是,第二个Output程序似乎根本无法读取。我在两个程序中都使用shmget创建内存,然后将其加入。我在输入程序中插入了char数组nameArray,然后Output应该从共享内存中读取它并指定名称。
任何帮助表示赞赏,代码如下:)
输入:
#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/