标签归档:c

linux下使用mmap实现进程间共享内存

linux下的mmap函数是把文件内容映射到一块内存(准确的说是虚拟内存)上,可以把对文件的操作转为对内存的操作,从而可以避免很多lseek()与read()、write()操作,非常适合于操作大文件或者频繁访问的文件。mmap一般的用途有:

1.将某个真实的文件读入内存,可以频繁读写,在必要的时候写回磁盘

2.各进程间可以共享映射区域

下面这个例子是实现父子进程间共享内存。
#include
#include
#include
#include
#include
#include
#include

typedef struct {
char name[10];
int age;
} person;

int main(){
int i;
person *p_map;
int size;
size = 10*sizeof(person);
p_map=(person*)mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);

if(fork() == 0){

sleep(2);

for(i=0;i<10;i++){ printf("child read: the %d person %s's age is %dn", i+1,(*(p_map+i)).name , (*(p_map+i)).age); } (*p_map).age = 100; munmap(p_map, size); return 0; } for(i=0;i<10;i++){ sprintf( (*(p_map+i)).name, "name%d", i); (*(p_map+i)).age=20+i; } sleep(5); printf("parent read: the first person's age is %dn", (*p_map).age); munmap(p_map, size); return 0; }[/code] 执行结果:

Google Protocol Buffers自带c++,java,python例子程序编译运行

在我的前一篇文章《Protocol Buffers的安装使用和C++/Python入门示例》中提到google protocol buffers自带了examples,里面有c++,java,python的例子。初学者在编译的过程中经常会遇到环境变量和jar包找不到的问题。这里,我将我的编译过程详细记录在这里,避免大家走弯路。

1. 准备工作

首先,当然是编译和安装好protobuf,参照《Protocol Buffers的安装使用和C++/Python入门示例》一文即可。

我电脑上的protobuf目录是protobuf-2.3.0.tar.gz 解压后在  /home/admin/work/protobuf-2.3.0/

编译后安装在  /home/admin/work/protobuf-2.3.0/proto,  在proto目录下有bin,include,lib三个目录

2. 编译c++例子

在examples目录下运行 make 会编译c++,java,python的例子,但是没有设置环境变量的话,会有很多错误:

这个是因为Makefile中会用pkg-config命令检测环境变量,但是没有设置PKG_CONFIG_PATH,找不到protobuf.pc这个文件

再执行  make cpp 单独编译c++,编译好后会生成两个可执行文件add_person_cpp 和 list_people_cpp,运行即可。

3. 编译java例子

直接执行 make java 会出现一大堆的找不到包的错误:

需要自己编译protobuf的jar包了,要先安装好maven才能编译哦

最终会生成一个jar包 /home/admin/work/protobuf-2.3.0/java/target/protobuf-java-2.3.0.jar

如果没有maven,可以到网上下载这个包。

设置java classpath:

执行make java,就会生成add_person_java和list_people_java两个可执行脚本。脚本内容如下:

如果在编译的时候出现如下的错误:

原因是protobuf的版本不对,需要用最新的版本,如 2.4.1

4. 编译python例子

发现编译能成功,但是运行的时候提示找不到相关模块… --> 阅读全文