一, 概念 共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对 其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用, 来达到进程间的同步及互斥。 二,特点 1.共享内存就是允许两个不相关的进程访问同一个逻辑内存; 2.共享内存是在两个正在运行的进程之间共享和传递数据的一种最有效的方式; 3.不同进程之间共享的内存通常安排为同一段物理内存; 4.共享内存不提供任何互斥和同步机制,一般用信号量对临界资源进行保护; 5.接口简单
三, 所有进程间通信的特点
1)管道
管道分为有名管道和无名管道 无名管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系一般指的是父子关系。无明管道一般用于两个不同进程之间的通信。当一个进程创建了一个管道,并调用fork创建自己的一个子进程后,父进程关闭读管道端,子进程关闭写管道端,这样提供了两个进程之间数据流动的一种方式。 有名管道也是一种半双工的通信方式,但是它允许无亲缘关系进程间的通信。
2)信号量
信号量是一个计数器,可以用来控制多个线程对共享资源的访问.,它不是用于交换大批数据,而用于多线程之间的同步.它常作为一种锁机制,防止某进程在访问资源时其它进程也访问该资源.因此,主要作为进程间以及同一个进程内不同线程之间的同步手段.
3)消息队列
消息队列是消息的链表,存放在内核中并由消息队列标识符标识.消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等特点.消息队列是UNIX下不同进程之间可实现共享资源的一种机制,UNIX允许不同进程将格式化的数据流以消息队列形式发送给任意进程.对消息队列具有操作权限的进程都可以使用msget完成对消息队列的操作控制.通过使用消息类型,进程可以按任何顺序读信息,或为消息安排优先级顺序.
4)共享内存
共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问.共享内存是最快的IPC(进程间通信)方式,它是针对其它进程间通信方式运行效率低而专门设计的.它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步与通信.
四 , 共享内存的代码实现 1. semget函数 创建一个新信号量或取得一个已有信号量
int semget(key_t key, int num_sems, int sem_flags);
2.semctl函数 直接控制信号量信息
int semctl(int sem_id, int sem_num, int command, ...);3.shmat()函数 第一次创建完共享内存时,它还不能被任何进程访问,shmat函数的作用就是用来启动对该共享内存的访问,并把共享内存连接到当前进程的地址空间。
shm_id:由shmget函数返回的共享内存标识。 shm_addr:指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址。 shm_flg:是一组标志位,通常为0。4.shmdt()函数 该函数用于将共享内存从当前进程中分离。注意,将共享内存分离并不是删除它,只是使该共享内存对当前进程不再可用。
编写测试用例如下: comm.h comm.c server.c client.c