Linux进程间通讯的方法有信号,消息队列,管道,共享内存。本篇介绍共享内存。
每一个进程都有自己的虚拟地址空间,每个进程的空间之间严格区分,互不干扰。但通过系统调用开辟一片内存,让不同进程都连接到此空间,就可以实现多进程共享一片空间。
进程本身认为,自己只操作了自己的空间,事实上操作的是一片与其它进程共用的空间。这样可以实现进程间的数据"传输",即进程间通讯。
共享内存是一种很快的进程间通讯方法。
拿共享内存和管道作比较:
写数据 | 读数据 | |
共享内存 | 直接写入内存 | 直接读取内存 |
管道 | 调用系统调用写入数据 | 调用系统调用读取数据 |
可以看到,共享内存在建立内存映射后,对数据的读写都不需要系统调用。而管道读写都需要系统调用。在Linux系统编程(一) 认识系统调用中介绍过,每一次系统调用,都要保护现场数据,转入核心空间操作,结束后恢复现场工作,转入用户空间。管道完成一次完整的读取需要转换四个操作空间,明显效率远低于共享内存。
使用方法
头文件:sys/types.h sys/ipc.h sys/shm.h
调用:shmget() shmctl() shmat() shmdt
1.
int shmget(key,size,shmflg)
key_t key ;
int size,shmflg;
第一个参数key是一个整数,可以理解为共享内存的名字,由程序员自己设定,或者可以通过ftok()产生(例如ftok("."'a')),第二个参数一个整数,表示开辟地址空间的大小,单位为字节。第三个参数用来建立共享内存并设定其权限。
用法一:创建共享内存 int id=shmget(key,size,IPC_CREAT|0644) 这里的size应为希望开辟的大小。id接受返回值,为一个识别码。
用法二:获取共享内存id int id=shmget(key,0,0) 成功将返回名为key的共享内存的识别码。失败返回-1;
2