Linux 共享内存vector,linux上c++通过使用动态库达到共享内存,该如何处理

当前位置:我的异常网» 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)

文章评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值