欢迎来到500万彩票网-安全购彩!
500万彩票网给排水系统解决方案专业提供商
专注精品设备10余年,成功服务500强
联系我们
售后热线: 0317-6899218
地址:中国河北省孟村回族自治县希望新区
当前位置:主页 > 500万彩票新闻 >
500万彩票下载浅谈Linux管道(pipe)
作者:500万彩票网-安全购彩 发布日期:2022-06-18 19:12

  管道(pipe)是Linux体系中主要的历程间通讯(IPC)机制,又分为匿名管道(anonymous pipe)和定名管道(named pipe/FIFO)两种。 明天用脑过分,几句话简朴议论一下。

  当我们在普通语境下提起管道这个词时,说的就是匿名管道。匿名管道在两个有亲缘干系的历程(即存在父子或兄弟干系的历程)之间创立,素质 上是由内核办理的一小块内存缓冲区,默许巨细由体系中的 PIPE_BUF 常量指定(默以为一页,即4096字节)。它的一端毗连一个历程的输出, 用于写入数据;另外一端毗连另外一个历程的输入,用于读出数据。管道是半双工事情的,也就是能够A历程读B历程写,也能够B历程读A历程写,但 是A、B两个历程不克不及同时读写。 匿名管道在父历程中经由过程体系挪用 int pipe(int fd[2]) 创立。fd[]为两个文件形貌符的数组,此中fd[0]牢固为管道的读端,fd[1]牢固为管道的写端, 不克不及弄反。在父历程fork出子历程以后,利用管道的两方别离封闭fd[0]和fd[1],就可以够操纵管道了。以下图所示,父历程封闭fd[1],从管道读 数据;子历程封闭fd[0],向管道写数据。

  管道的读写用最根本的read()/write()体系挪用来完成。留意当管道读取端没有封闭且管道已满时,write()会被壅闭;而当管道写入端没有封闭且 管道为空时,read()会被壅闭。固然,假如管道的读写两头都被封闭,管道就会消逝。 在Linux Shell中,匿名管道能够经由过程管道标记 创立,比方: cat my.txt grep lmagic 。此时cat是父历程,grep是子历程,cat历程的尺度输出经由过程 管道对接grep历程的尺度输入。

  匿名管道只能用于有亲缘干系的历程之间,而定名管道则能够用于随便历程之间。与匿名管道差别的是,定名管道会借用FIFO文件来完成。FIFO 文件在文件体系中创立,有本人的途径和称号,可是它仅仅作为一个管道的标识表记标帜,其数据仍旧由内核办理,寄存在内存中。FIFO这个称号恰好也 提醒了管道数据先入先出的素质。 我们能够经由过程体系挪用 int mkfifo(const char *filename, mode_t mode) 来创立一个FIFO文件,而历程经由过程open()翻开FIFO文件的方法决议了它是读端 (O_RDONLY)仍是写端(O_WRONLY)。留意不克不及以读写方法(O_RDWR)翻开FIFO文件。出格地,如果设置了非壅闭标记位 O_NONBLOCK的话,假如有一个历程试图以读/写方法翻开一个没有正在被写/读的FIFO文件,open()就会立刻返回胜利,反之则会壅闭。而 read()/write()的壅闭方法与匿名管道是完整不异的。 最初,假如FIFO文件的读端和写端都封闭,它也不会消逝,而是留在文件体系中以便其他历程利用。

  匿名管道和定名管道的底层是不异的,就是借助两个file构造指向统一个VFS inode来完成,这个inode又指向一个页面,以下图所示。

  留意两个file构造的操纵f_op是差别的,500万彩票网址如许就可以够奇妙地经由过程一般的文件操纵来完成对管道的操纵了。

Copyright © 2002-2021 500万彩票网-安全购彩 版权所有

地址:中国河北省孟村回族自治县希望新区

电话: 0317-6899218

技术支持:500万彩票网