管道是如进行进程间通信的

管道是如何进行进程间通信的

匿名管道和命名管道都是内核的文件

匿名管道是Linux系统提供的一个系统函数,可以通过这个函数来进行管道的使用

//命令行中 | 也起到管道的作用
a|b

管道背后的原理就是两个文件描述符号,一个管道相当于一个队列。有管道的头和尾,往管道的尾里去写东西,从管道的头里去读东西。这个队列如何控制头跟尾的呢,就是两个文件描述符,来表示管道的两端,读取端:fd[0]、写入端:fd[1]
在一个进程里创建一个匿名管道之后呢,大概如下图所示:

通过pipe函数创建了一个管道

创建了一份管道相当于创建了一份缓存,因为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

命名管道
实现原理和匿名管道差不多,本质上都是内核的文件。命名管道会写到磁盘文件里,不相关的进程也能一头写一头读。

笔记

你可能感兴趣的:(管道是如进行进程间通信的)