(一)FD 文件描述符
文件描述符的概念见: https://blog.csdn.net/xx_ay/article/details/104362026
(二) 命令管道
1. 进程间通信
什么是管道
- 管道是Unix中最古老的进程间通信形式。
- 行一个进程连接到另一个进程的一个数据流称为“管道”。
进程间通信(IPC)
每个进程有各自不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到。所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间中拷贝到缓冲区,进程2再从缓冲区把数据读走。内核提供的这种机制就是进程间通信。
通信需要媒介,两个进程间通信的媒介就是内存。通信的原理就是让两个或多个进程能够看到同一块共同的资源,这块资源一般都是由内存提供。
2. 匿名管道pipe
管道是IPC最基本的一种实现机制。我们都知道在Linux下“一切皆文件”,其实这里的管道就是一个文件。管道实现进程通信就是让两个进程都能访问该文件。
管道的特征:
①只提供单向通信,也就是说,两个进程都能访问这个文件,假设进程1往文件内写东西,那么进程2 就只能读取文件的内容。
②只能用于具有血缘关系的进程间通信,通常用于父子进程建通信
③管道是基于字节流来通信的
④依赖于文件系统,它的生命周期随进程的结束结束(随进程)
⑤其本身自带同步互斥效果
3. 命名管道FIFO
匿名管道虽然实现了进程间通信,但是它具有一定的局限性:首先,这个管道只能是具有血缘关系的进程之间通信;第二,它只能实现一个进程写另一个进程读,而如果需要两者同时进行时,就得重新打开一个管道。
为了使任意两个进程之间能够通信,就提出了命名管道(named pipe 或 FIFO)。
1、与管道的区别:提供了一个路径名与之关联,以FIFO文件的形式存储于文件系统中,能够实现任何两个进程之间通信。而匿名管道对于文件系统是不可见的,它仅限于在父子进程之间的通信。
2、FIFO是一个设备文件,在文件系统中以文件名的形式存在,因此即使进程与创建FIFO的进程不存在血缘关系也依然可以通信,前提是可以访问该路径。
3、FIFO(first input first output)总是遵循先进先出的原则,即第一个进来的数据会第一个被读走。
实例1: 匿名管道和命名管道的简单创建
实例2: 命名管道实现进程并发
以上例子有几点需要说明:
1. 管道文件重写不会影响之前写入的内容。只有之前写入的被其他进程读走了,才会从管道文件删除。所以是echo >&8 不是追加。
2. echo 后面不写入任何东西其实就有一个回车。因为echo命令本身自带回车符哈。
3. 只要文件的描述符没有释放,删除文件后文件不会消失。 使用完成后最后用 exec 8>&- 来释放这个文件描述符。
20200217