使用POSIX将结构数据读取和写入共享内存



我正试图将结构读写到共享内存中,但程序因权限问题和分段错误而崩溃。写CPP->我给出的运动值,它陷入了循环,最后,它给出了";struct failed:cannot allocate memory";,分段故障

写入.cpp

#include<iostream>
#include<fcntl.h>
#include<sys/stat.h>
#include<sys/mman.h>
#include<sys/file.h>
#include<unistd.h>
#include<sys/types.h>
#include<errno.h>
#include<dirent.h>
#include<string.h>
#include"headerfile.h"
using namespace std;
int main()
{
int fd;
char *pg_addr;
int size =10000;
int mode = S_IRWXO|S_IRWXG|S_IRWXU;
int i=0;
while(1)
{
cout<<"nenter 1 to read again and 2 to exit : ";
cin>>i;
if(i==2)
break;
fd=shm_open("memory_exp1",O_RDONLY, 0666);
if (fd == -1)
perror("shm_open");
struct shmbuf *shmp = (shmbuf*)mmap(NULL,sizeof(*shmp),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
if(shmp==MAP_FAILED)
perror("MMap error");        
cout <<"n Read data is" << shmp->buf << "n" << shmp->cnt;        
}
close(fd);
return 0;
}

读取.CPP

#include<iostream>
#include<fcntl.h>
#include<sys/stat.h>
#include<sys/mman.h>
#include<sys/file.h>
#include<unistd.h>
#include<sys/types.h>
#include<errno.h>
#include<dirent.h>
#include<string.h>
#include"headerfile.h"
using namespace std;
int main()
{
cout<<"point1";
int fd;
char *pg_addr;
int size =10000;
int i=0;
char strTemp[100]="";
int mode = S_IRWXO|S_IRWXG|S_IRWXU;

fd=shm_open("memory_exp1",O_CREAT,mode);
while(1)
{
cout<<"nEnter 2 to exitnto continue press any other value :";
cin >> i;
if(i==2)
break;
fd=shm_open("memory_exp1",O_RDWR, mode);
if (fd == -1)
perror("shm_open");
if (ftruncate(fd, size) == -1)
perror("ftruncate");
struct shmbuf *shmp=(shmbuf*)mmap(NULL,sizeof(*shmp),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
if(shmp == MAP_FAILED)
perror("Struct failed");       
cout<<"nEnter the value";
cin>>strTemp;
shmp->cnt=100;
memcpy(&shmp->buf,strTemp,100);

close(fd);
}
return 0;
}

运行Write.cpp时,共享内存映射的大小为零,或者没有创建共享内存映射。所以我建议运行第一个Read.cpp,同时按下任何其他值输入任何要提示的值";输入值"0";写下你的价值。按照我在前一句中写的操作是有效的,因为当你按照前一句所说的操作时,它会扩展共享内存映射的大小,使mmap调用成功。如果你想在windows中尝试你的代码,你可以使用我的repohttps://github.com/CoderRC/libmingw32_extended。

相关内容

  • 没有找到相关文章

最新更新