一、共享内存
1、 共享内存是被多个进程共享的一部分物理内存.共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以 立刻 看到其中的内容
2.、共享内存实现分为两个步骤:
一、创建共享内存,使用shmget函数
二、映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数
3、当一个进程不再需要共享内存时,需要把它从进程地址空间中脱离。
int shmdt ( char *shmaddr )
二、消息队列
1、消息队列就是一个消息的链表.可以把消息看作一个记录,具有特定的格式.进程可以向中按照一定的规则添加新消息;另一些进程则可以从消息队列中读走消息
2、目前主要有两种类型的消息队列:
POSIX消息队列以及系统V消息队列,系统V消息队列目前被大量使用
3、消息队列的内核持续性要求每个消息队列都在系统范围内对应唯一的键值,所以,要获得一个消息队列的描述字,必须提供该消息队列的键值
4、key_t ftok (char*pathname, char proj)
功能: 返回文件名对应的键值。
pathname: 文件名
proj: 项目名(不为0即可)
5、
int msgsnd(int msqid,struct msgbuf*msgp,int msgsz,int msgflg)
功能:向消息队列中发送一条消息
6、Msqid: 已打开的消息队列id
Msgp: 存放消息的结构
Msgsz: 消息数据长度
Msgflg: 发送标志,有意义的msgflg标志为IPC_NOWAIT,指明在消息队列没有足够空间容纳要发送的消息时,msgsnd是否等待
三、信号灯
信号量(又名:信号灯)与其他进程间通信方式不大相同,主要用途是保护临界资源.
进程可以根据它判定是否能够访问某些共享资源。除了用于访问控制外,还可用于进程同步
二值信号灯:信号灯的值只能取0或1,类似于互斥锁。 但两者有不同:
信号灯强调共享资源,只要共享资源可用,其他进程同样可以修改信号灯的值;
互斥锁更强调进程,占用资源的进程使用完资源后,必须由进程本身来解锁。
计数信号灯:信号灯的值可以取任意非负值