UNIX网络编程——进程间通信

时间:2021-05-17 14:57:00

    进程间通信,Interprocess Communication,IPC。主要有以下四种不同的IPC形式:

          A. 消息传递(管道、FIFO 和 消息队列);

          B. 同步(互斥量、条件变量、读写锁、文件和记录锁、信号量);

          C. 共享内存区(匿名共享内存区有名共享内存区);

          D. 远程过程调用(Solaris门、Sun RPC);


一、消息传递

1、管道和FIFO

(1)管道的根本局限在于没有名字,从而只能由有亲缘关系的进程使用。FIFO也叫有名管道,解决了这个限制。管道和FIFO都是使用read和write函数来访问的。

(2)shell命令:who  |  sort  |  lp  ——将创建三个进程和期间的两个管道:

UNIX网络编程——进程间通信

(3)创建管道:int  pipe (int  fd[2])——提供一个单路数据流,返回两个文件描述符。fd[0]打开来读,fd[1]打开来写。管道的常见用途是用在各种shell中,这种情况下半双工管道足够。(可以用socketpair函数创建一个全双工的IPC管道)

(4)管道的典型用途是(单向数据流):为两个不同进程(一个父进程,一个子进程)提供进程间的通信。

UNIX网络编程——进程间通信

首先父进程创建一个管道,然后调用fork派生一个自身的副本:

UNIX网络编程——进程间通信

然后,父进程关闭读端,子进程关闭写端。

UNIX网络编程——进程间通信

(5)双向数据流的两个管道:

UNIX网络编程——进程间通信

(6)创建FIFO:int  mkfifo(const char × pathname,mode_t  mode),pathname是一个普通的unix路径名,也是该FIFO的名字。


2、单个服务器,多个客户

UNIX网络编程——进程间通信


3、消息队列可认为是一个消息链表。 ——有足够写权限的线程可往队列中“放置”消息,有足够读权限的线程可从队列中取走消息。

(1)管道和FIFO是字节流模型,没有消息边界,也没有与每个消息关联的类型。

(2)当一个管道或着FIFO的最后一次关闭发生时,仍在该管道或FIFO上的数据将被丢弃。

(3)消息队列具有“随内核的持续性”。即使当前没有进程打开着某个消息队列,该消息队列及其上的各个消息也将一直存在直到引用计数达到0删除该队列为止。


二、同步

1、互斥锁和条件变量

(1)互斥锁(相互排斥):上锁与解锁:

UNIX网络编程——进程间通信

(2)条件变量:等待与信号发送:

         互斥锁用于上锁,条件变量则用于等待。

UNIX网络编程——进程间通信


2、读写锁:

互斥锁:把试图进入“临界区”的所有线程都阻塞。读写锁:把获取读写锁用于读和获取读写锁用于写进行区分。

(1)规则:A. 只要没有在写,就可以读;     B. 没有任何读、写时,才可以写。

(2)读锁:共享锁。      写锁:独占锁。

(3)获取与释放“读、写锁”:

UNIX网络编程——进程间通信


3、记录上锁

UNIX网络编程——进程间通信


4、信号量:

UNIX网络编程——进程间通信


三、共享内存区

1、简介:

UNIX网络编程——进程间通信

       共享内存区,信息不经由内核传递(可用IPC形式中最快的),数据只复制两次,一次从输入文件到共享内存区,一次从共享内存区到输出文件。显然,使用共享内存区的这些进程必须协调或同步对该共享内存区的使用(基于某种形式的同步)。


四、远程过程调用

1、门:

(1)简介:

       远程过程调用,Remote Procedure Call,RPC,被调用过程和调用过程处于同一台主机上的不同进程中。调用者称为客户,被调用的过程称为服务器。(客户和服务器之间以函数参数和返回值形式交换信息)

       门调用是同步的。

UNIX网络编程——进程间通信


2、Sun RPC:


五、总结:

UNIX网络编程——进程间通信UNIX网络编程——进程间通信UNIX网络编程——进程间通信