美文网首页
管道是如进行进程间通信的

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

作者: 吃掉夏天的怪物 | 来源:发表于2021-09-21 15:22 被阅读0次

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

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

    匿名管道是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

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

    笔记

    相关文章

      网友评论

          本文标题:管道是如进行进程间通信的

          本文链接:https://www.haomeiwen.com/subject/uzgbgltx.html