Ch 15 进程间通信
管道
单向,父子之间
一个管道由一个进程创建,在进程调用 fork 之后,这个管道就能在父子间使用,通过 pipe 函数创建,返回两个描述符,一个为读打开,一个为写打开
fork 之后我们指定哪些描述符需要关闭读或者写来确定数据的流向 写一个关闭的管道会产生信号 SIGPIPE。 管道是内核中的一段缓冲区
FIFO命名管道
不相关的进程也能传输数据,可用于非线性连接
使用场景: 可以对输出流进行复制 客户进程和服务器进程进行通信:使用同一个 FIFO 接收请求,使用不同的 FIFO 对相应的进程进行回应
XSI IPC
包含消息队列、信号量和共享存储器
每个内核中的 IPC 结构都可以使用一个非负整数进行引用,标识符是 IPC 对象的内部名,对外需要一个键值作为外部名进行关联,键值的数据类型是一个长整形,最后由内核转成标识符
缺点:没有引用计数,在文件系统中没有名字(不能被 ls 显示出来),不使用文件描述符(无法进行多路转接)
消息队列
消息的链表,存储在内核中,由消息队列标识符(队列ID)标识 可以按先进先出次序取消息,也可以按照消息的类型字段取消息
速度与unix域套接字这类全双工管道相比差不多,考虑到上述的缺点,应该尽量使用全双工管道
信号量和共享存储
两者通常会搭配使用,信号量用于同步进程使得进程可以在其他进程读之前写入数据,共享存储最快因为它不需要在客户进程和服务器进程之间复制
XSI IPC 不能与文件关联,而用 mmap 则可以
POSIX 信号量
比 XSI 性能更好,有引用计数
sem_post +1 sem_wait -1 信号量减到0则阻塞