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 <vector>
std::vector<float> 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 <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
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 <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
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)
{
perror("shmget error");
return;
}
p_map = (people*)shmat(shm_id,NULL,0);
for(i = 0;i<10;i++)
{
printf( "name:%s\n",(*(p_map+i)).name );
printf( "age %d\n",(*(p_map+i)).age );
}
if(shmdt(p_map) == -1)
perror(" detach error ");
}
注:事实上,ftok函数仅仅是根据文件名和ID生成一个起标识作用的key,根据《GNU Linux编程指南》说,Linux下实现这一函数还有点问题,不推荐用。于是我一般来说都是自己定义一个唯一的key,而不使用ftok函数。
[解决办法]
http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html
[解决办法]
方法是可行的.
共享内存就是可以供多个不同进程访问的,和是否使用.SO没有关系.
但是楼主什么地方能说明你写到共享内存里面去了?!
[解决办法]
楼主的代码
- C/C++ code
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 }
[解决办法]
to 楼主
共享内存是用于进程间通信使用的,他开辟以后是独立在程序之外的,并不是程序所使用的临时资源,所以一但建立,是不会在程序退出的时候自动释放的.
只有在shmdt之后,或者机器重启的时候才会释放.
还有一个需要提醒楼主,只有在所有使用该共享内存的进程都释放连接的情况下,资源才能被真正释放,否则即使系统中根据KEY查询不到对应内存,但这个内存也会变成某几个程序的私有内存,其资源实际上并没有释放.