(一)FD  文件描述符

文件描述符的概念见https://blog.csdn.net/xx_ay/article/details/104362026

 

(二) 命令管道

1. 进程间通信

什么是管道

  • 管道是Unix中最古老的进程间通信形式。
  • 行一个进程连接到另一个进程的一个数据流称为“管道”。

Shell学习15天(FD和命令管道)- 06day

进程间通信(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: 匿名管道和命名管道的简单创建

Shell学习15天(FD和命令管道)- 06day

实例2:  命名管道实现进程并发

Shell学习15天(FD和命令管道)- 06day

 

Shell学习15天(FD和命令管道)- 06day

 

以上例子有几点需要说明:

1. 管道文件重写不会影响之前写入的内容。只有之前写入的被其他进程读走了,才会从管道文件删除。所以是echo >&8 不是追加。

2. echo 后面不写入任何东西其实就有一个回车。因为echo命令本身自带回车符哈。

3. 只要文件的描述符没有释放,删除文件后文件不会消失。 使用完成后最后用 exec 8>&-  来释放这个文件描述符。

 

 

 

20200217

相关文章:

  • 2021-07-16
  • 2021-10-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-12
  • 2022-12-23
  • 2021-10-23
  • 2022-12-23
猜你喜欢
  • 2021-06-03
  • 2021-12-16
  • 2022-01-08
  • 2022-12-23
  • 2021-05-27
  • 2021-09-13
  • 2021-08-19
相关资源
相似解决方案