- 匿名管道:其实就是内核里面的一串缓存
- 创建管道:返回了两个文件描述符,这表示管道的两端,一个是管道的读取端描述符 fd[0],另一个是管道的写入端描述符 fd[1]。
进程间内存无法共享,但是文件可以。可以利用这点进行文件到进程先虚拟内存映射,然后操作文件。
先通过fork copy父进程的 task_struct ,然后就copy了 files_struct,也就是有了这俩个fd到引用。
如图先copy 引用
image.png
第二步将,fd[0] 和子进程到 fd[1] 引用删除,因为管道只能 一端输入一端输出。
image.png
通过Shell 的 | 创建的匿名管道因为两个进程没有父子关系,都是shell创建的
image.png
接下来要将A的标准输出和B的标准输入衔接到上面的管道的输入输出:
- 在 A 进程中,写入端可以做这样的操作:dup2(fd[1],STDOUT_FILENO),将 STDOUT_FILENO(也即第一项)不再指向标准输出,而是指向创建的管道文件,那么以后往标准输出写入的任何东西,都会写入管道文件。
- 在 B 进程中,读取端可以做这样的操作,dup2(fd[0],STDIN_FILENO),将 STDIN_FILENO 也即第零项不再指向标准输入,而是指向创建的管道文件,那么以后从标准输入读取的任何东西,都来自于管道文件。
- 命名管道:
image.png
网友评论