马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
匿名管道是UNIX体系进程间通讯(IPC)的一种根本情势,它允许具有血缘关系的进程之间举行数据传输。在Linux情况下,匿名管道是通过内核中的缓冲区实现的,这个缓冲区的巨细是有限的,通常由操纵体系决定。匿名管道是半双工的通讯方式,即数据只能单向运动,要么是父进程向子进程发送数据,要么是子进程向父进程发送数据。
在Linux中,可以通过pipe()体系调用来创建匿名管道。这个函数会返回两个文件形貌符,pipefd[0]用于读取,而pipefd[1]用于写入。创建管道后,通常会通过fork()创建子进程,子进程会继承父进程的文件形貌符,从而实现进程间的通讯。
用fork来共享管道原理
fork产生子进程,会通过表现拷贝来拿到跟父进程一样的布局。当在创建父进程时打开了管道读和写两头,子进程在创建时也会得到这两头,然后我们可以同时关闭父进程的写端f[1],子进程的读端f[0],那么我们就可以得到父进程与子进程通过管道举行,子进程写,父进程读的通讯了。
通过文件形貌符的角度—明确管道
父进程创建管道
父进程fork出子进程
父进程关闭fd[0],子进程关闭fd[1]
从内核级的角度—管道的本质:先让差别的进程看到同一份资源!
1.先打开管道再创建子进程,使用的原理是:子进程继承父进程的特性
2 为什么叫做管道,而且只是单向管道?由于:早些时间,根据需求只须要单向,而且简朴
以是:匿名管道:不须要路径(磁盘),也不须要名字,只要想用的时间直接在内核中创建就行。
匿名管道的五大特性:
1. 面向字节流
2. 用来举行具有血缘关系的进程,进程管道通讯,常用于父子
3. 文件的生命周期,随进程的竣事而竣事,管道也一样的
4. 它们但是单向数据通讯
5. 管道自带同步互斥等掩护机制(掩护共享资源)
四种场景 :
1. 当管道中没有数据时,读取(read)会壅闭【read是一个体系调用】
2. 当管道满了后,写(write)会壅闭【write是一个体系调用】
3. 当管道写端关闭读端正常,读端读到0,体现读到我家末端
4. 当管道读端关闭,写端正常,OS会直接杀掉写入的进程(OS不会浪费任何一点资源,OS会给目的进程发送信号(13 SIGPIPE))
|