15.1引言
1.经典的IPC:管道、FIFO、消息队列、信号量以及共享存储器。
2.套接字和STREAMS是仅有的两种支持不同主机上各个进程间IPC的类型。
15.2管道
1.管道有下面两种局限性:
- 历史上,它们是半双工的。
- 它们只能在具有公共祖先的进程之间使用。通常,一个管道由一个进程创建,然后该进程调用fork,此后父、子进程之间就可以应用该管道。
FIFO没有第二种局限性,UNIX域套接字和命名管道则没有这两种局限性。
2.每当在管道线中键入一个由shell执行的命令序列时,shell为每一条命令单独创建一进程,然后将前一条命令进程的标准输出用管道与后一条命令的标准输入想连接。
3.当管道的一端被关闭后,下列两条规则起作用:
- 当读一个写端已被关闭的管道时,在所有数据都被读取后,read返回0,以指示达到了文件结束处。
- 如果写一个读端已被关闭的管道,则产生信号SIGPIPE。
4.在写管道(或FIFO)时,常量PIPE_BUF规定了内核中管道缓冲区的大小。如果管道调用write,而且要求写的字节数小于等于PIPE_BUF,则次操作不会与其他进程对同一管道(或FIFO)的write操作穿插进行。但是,若有多个进程同时写一个管道(或FIFO),而且有进程要求写的字节数超过PIPE_BUF字节数时,则写操作的数据可能相互穿插。
5.当一个程序产生某个过滤程序的输入,同时又读取该过虑程序的输出时,则该过滤程序就成为协同进程。
15.5FIFO
- FIFO有时被称为命名管道。通过FIFO,不相关的进程也能交换数据。FIFO是一种文件类型。
- FIFO的两种用途:
- FIFO由shell命令使用以便将数据从一条管道线传送到另一条,为此无需创建中间临时文件。
- FIFO用于客户进程-服务器进程应用程序中,以在客户进程和服务器进程之间传递数据。
- 管道只能用于进程间的线性连接,然而,因为FIFO具有名字,所以它可用于非线性连接。
15.6XSI IPC
- 有三种IPC我们称作XSI IPC,即消息队列、信号量以及共享存储器。
- 有多种方法使客户进程和服务器进程在同一IPC结构上汇合:
- 服务器进程可以指定键IPC_PRIVATE创建一个新IPC结构,将返回的标识符存放在某处(例如一个文件)以便客户进程取用。
- 在一个公用头文件中定义一个客户进程和服务器进程都认可的键。然后服务器进程制定此键创建一个新的IPC结构。
- 客户进程和服务器进程认同一个路径名和项目ID(项目ID是0~255之间的字符值),接着调用函数ftok将这两个值变换为一个键。
- XSI IPC的主要问题是:IPC结构是在系统范围内起作用的,没有访问计数。(将此与管道相比,当最后一个访问管道的进程终止时,管道就被完全地删除了。对于FIFO而言,虽然当最后一个引用FIFO的进程终止时其名字仍然保留在系统中,直至显示地删除它,但是留在FIFO中的数据却在此时全部被删除。) XSI IPC的另一个问题是:这些IPC结构在文件系统中没有名。
15.7消息队列
- 消息队列是消息的链接表,存放在内核中并由消息队列标识符标识。
- 并不一定要以先进先出次序取消息,也可以按消息的类型字段取消息。
15.8信号量
- 信号量是一个计数器,用于多进程对共享数据对象的访问。
15.9共享存储
- 共享存储允许两个或更多进程共享一给定的存储区。使用共享存储时要掌握的唯一窍门是多个进程之间对给定存储区的同步访问。