当前位置:我的异常网» C++ » linux上c++通过使用动态库达到共享内存,该如何处理
linux上c++通过使用动态库达到共享内存,该如何处理
www.myexceptions.net 网友分享于:2013-03-29 浏览:42次
linux上c++通过使用动态库达到共享内存
在linux上用C++生成的动态库,达到共享内存是否可行?就是两个独立程序调用同一个动态库,一个读动态库中的变量,一个写动态库的变量,来达到将一个程序的值传到另一个程序
如动态库程序
libtest.h
------------------------------------
#ifndef __LIBTEST_H__
#define __LIBTEST_H__
//设置值
bool my_SetValue(float val);
//读取值
bool my_GetValue(int pos,float *val);
//清空值
bool my_ClearValue(void);
#endif
----------------------------------------------
libtest.cpp
--------------------------------------------
#include "libtest.h"
#include
std::vector myList;//存放信息
//设置值
bool my_SetValue(float val)
{
myList.push_back(val);
return true;
}
//读取值
bool my_GetValue(int pos,float *val)
{
if(pos < myList.size())
{
*val=myList[pos];
return true;
}
return false;
}
//清空值
bool my_ClearValue(void)
{
myList.clear();
}
------------------------------------
写值程序write.cpp
-------------------------------------
#include "libtest.h"
int main()
{
float val=1.0;
my_SetValue(val);
float TestRes;
my_GetValue(0,&TestRes); //取刚放入的第一个,这里有得到TestRes=1.0
}
------------------------------------
写值程序read.cpp
-------------------------------------
#include "libtest.h"
int main()
{
float TestRes;
my_GetValue(0,&TestRes); //取刚放入的第一个,得不到值,my_GetValue返回false,即动态库中myList.size()=0
}
问下这种想法是否可行,来实现从一个程序写值到so的变量,再让另一个程序读出来??
如果可行,我这里的问题是什么,动态库的内存发生了什么变化吗??
------解决方案--------------------
直接使用共享内存就行了,方便,而且不需要so。
------解决方案--------------------
源代码是从别人的文章中抄过来的,不是原创,不过写得不错,主要是描述两个不同的进程从共享内存中存取数据的技术,我加了点分析:
第一个是写数据:
/***** testwrite.c *******/
#include
#include
#include
#include
typedef struct{
char name[4];
int age;
} people;
main(int argc, char** argv)
{
int shm_id,i;
key_t key;
char temp;
people *p_map;
char* name = "/dev/shm/myshm2";
key = ftok(name,0);
if(key==-1)
perror("ftok error");
/*先用ftok创建一个key,再调用shmget,创建一块共享内存区域*/
shm_id=shmget(key,4096,IPC_CREAT);
if(shm_id==-1)
{
perror("shmget error");
return;
}
/*将这块共享内存区附加到自己的内存段*/
p_map=(people*)shmat(shm_id,NULL,0);
temp='a';
for(i = 0;i<10;i++)
{
temp+=1;
memcpy((*(p_map+i)).name,&temp,1);
(*(p_map+i)).age=20+i;
}
/*写数据完毕,将其从自己的内存段中“删除”出去*/
if(shmdt(p_map)==-1)
perror(" detach error ");
}
/*读进程首先要得到那块内存块,这个时候,ftok根据文件名和ID创建的key就
很用了,步骤同创建是一样的*/
/********** testread.c ************/
#include
#include
#include
#include
typedef struct{
char name[4];
int age;
} people;
main(int argc, char** argv)
{
int shm_id,i;
key_t key;
people *p_map;
char* name = "/dev/shm/myshm2";
key = ftok(name,0);
if(key == -1)
perror("ftok error");
shm_id = shmget(key,4096,IPC_CREAT);
if(shm_id == -1)
文章评论