管道是如何进行进程间通信的
匿名管道和命名管道都是内核的文件
匿名管道是Linux系统提供的一个系统函数,可以通过这个函数来进行管道的使用
//命令行中 | 也起到管道的作用
a|b
管道背后的原理就是两个文件描述符号,一个管道相当于一个队列。有管道的头和尾,往管道的尾里去写东西,从管道的头里去读东西。这个队列如何控制头跟尾的呢,就是两个文件描述符,来表示管道的两端,读取端:fd[0]
、写入端:fd[1]
。
在一个进程里创建一个匿名管道之后呢,大概如下图所示:
创建了一份管道相当于创建了一份缓存,因为LINUX中是一切皆文件的。
如何让创建的管道在两个进程中用,fork()
子进程,会复制父进程文件描述的结构体,fd数组也会复制一份。文件描述符相当于指针,子进程的复制相当于浅拷贝。
由于管道只能一端写入另一端读出。所以通常父进程只保留读取的fd,而子进程只保留写入的fd。
父进程和子进程各关闭一个fd描述符。
在shell里的命令,a和b是平级进程
。shell
首先创建一个子进程a然后在shell和a之间创建一个管道,然后fork出来了一个a这样呢shell与a有通信关系的,之后shell保留读取端,a保留写入端。之后shell再创建一个b,这样shell、a、b都指向了同一个管道, 这样shell再把它的fd0和fd1都给关掉,这样fork出来的b
命名管道
实现原理和匿名管道差不多,本质上都是内核的文件。命名管道会写到磁盘文件里,不相关的进程也能一头写一头读。
网友评论