进程间通信,Interprocess Communication,IPC。主要有以下四种不同的IPC形式:
A. 消息传递(管道、FIFO 和 消息队列);
B. 同步(互斥量、条件变量、读写锁、文件和记录锁、信号量);
C. 共享内存区(匿名共享内存区、有名共享内存区);
D. 远程过程调用(Solaris门、Sun RPC);
一、消息传递
1、管道和FIFO
(1)管道的根本局限在于没有名字,从而只能由有亲缘关系的进程使用。FIFO也叫有名管道,解决了这个限制。管道和FIFO都是使用read和write函数来访问的。
(2)shell命令:who | sort | lp ——将创建三个进程和期间的两个管道:
(3)创建管道:int pipe (int fd[2])——提供一个单路数据流,返回两个文件描述符。fd[0]打开来读,fd[1]打开来写。管道的常见用途是用在各种shell中,这种情况下半双工管道足够。(可以用socketpair函数创建一个全双工的IPC管道)
(4)管道的典型用途是(单向数据流):为两个不同进程(一个父进程,一个子进程)提供进程间的通信。
首先父进程创建一个管道,然后调用fork派生一个自身的副本:
然后,父进程关闭读端,子进程关闭写端。
(5)双向数据流的两个管道:
(6)创建FIFO:int mkfifo(const char × pathname,mode_t mode),pathname是一个普通的unix路径名,也是该FIFO的名字。
2、单个服务器,多个客户
3、消息队列可认为是一个消息链表。 ——有足够写权限的线程可往队列中“放置”消息,有足够读权限的线程可从队列中取走消息。
(1)管道和FIFO是字节流模型,没有消息边界,也没有与每个消息关联的类型。
(2)当一个管道或着FIFO的最后一次关闭发生时,仍在该管道或FIFO上的数据将被丢弃。
(3)消息队列具有“随内核的持续性”。即使当前没有进程打开着某个消息队列,该消息队列及其上的各个消息也将一直存在直到引用计数达到0删除该队列为止。
二、同步
1、互斥锁和条件变量
(1)互斥锁(相互排斥):上锁与解锁:
(2)条件变量:等待与信号发送:
互斥锁用于上锁,条件变量则用于等待。
2、读写锁:
互斥锁:把试图进入“临界区”的所有线程都阻塞。读写锁:把获取读写锁用于读和获取读写锁用于写进行区分。
(1)规则:A. 只要没有在写,就可以读; B. 没有任何读、写时,才可以写。
(2)读锁:共享锁。 写锁:独占锁。
(3)获取与释放“读、写锁”:
3、记录上锁
4、信号量:
三、共享内存区
1、简介:
共享内存区,信息不经由内核传递(可用IPC形式中最快的),数据只复制两次,一次从输入文件到共享内存区,一次从共享内存区到输出文件。显然,使用共享内存区的这些进程必须协调或同步对该共享内存区的使用(基于某种形式的同步)。
四、远程过程调用
1、门:
(1)简介:
远程过程调用,Remote Procedure Call,RPC,被调用过程和调用过程处于同一台主机上的不同进程中。调用者称为客户,被调用的过程称为服务器。(客户和服务器之间以函数参数和返回值形式交换信息)
门调用是同步的。
2、Sun RPC: