【Linux】管道实现通信

简介: 【Linux】管道实现通信

管道的原理:

       我们知道每个进程都是独立的,如果想要两个进程保持独立性的同时,还能够直接通信,那将会很麻烦,所以一般我们采用的都是间接的方法。

比如一个商场里面,一家店搞促销,举办了一个抽奖的活动,买了多少元的物品后可以来抽奖,老板把奖品的名字都写在一个个卡片上,放到了一个只有上端开口的盒子里面,路人从里面拿去一个卡片兑奖。

大家看到这里的老板和路人就相当于是两个进程,现在他们呢看到了同一份资源--盒子,他们通过盒子 输入/读取 信息,最终拿到信息。一样的道理,在Linux中进程间的通信都是要让两个进程看到同一份资源,fork()函数是一个创建子进程的函数,我们在用fork()函数打印信息的时候,为什么和我们的父进程打印的信息显示在同一个终端上,也就是此时我们的父子进程都能看到这一份文件,才能往里面打入信息。


我们创建一个文件,系统会从磁盘拿属于这个文件的文件信息放进去,我们的进程的内部有一份tast_struct 和 struct file *array[]  ,这个数组是一个存放文件指针的映射表,我们的进程可以在这张表中可以找到自己想要的文件,fork()的时候,这张表也会被拷贝,这张表的0、1、2 正对应着输入、输出、错误这三个流,所以子进程透过这张表看到的文件是和父进程一样的  


管道的规则:

        管道必须是单向的,一个进程是读那么另一个就必须是写

       我们在读取的时候,如果管道为空,那么进程会进入管道资源的等待队列

       写入的时候,如果管道是满的,也是一样的道理

一般而言,进程退出,管道释放,所以管道的生命随周期随进程

管道是半双工的,数据只能向一个方向流动,想要双方通信,需要建立两个管道

每个被打开的文件都有一个属于的引用计数,每有一个进程关闭这个文件,引用计数减减,为0,自动释放


匿名/命名:

匿名管道:子进程继承父进程

命名管道:通过一个fifo文件,这个文件是具有唯一路径的,通过磁盘

b9e7ad08413245168e8f755bf5731a09.jpg

这个是Linux下的接口,第二个参数是权限参数,设定前可以用umask设定默认权限

目录
相关文章
|
26天前
|
消息中间件 Linux 开发者
Linux进程间通信秘籍:管道、消息队列、信号量,一文让你彻底解锁!
【8月更文挑战第25天】本文概述了Linux系统中常用的五种进程间通信(IPC)模式:管道、消息队列、信号量、共享内存与套接字。通过示例代码展示了每种模式的应用场景。了解这些IPC机制及其特点有助于开发者根据具体需求选择合适的通信方式,促进多进程间的高效协作。
50 3
|
1月前
|
存储 Unix Linux
Linux I/O 重定向与管道
【8月更文挑战第17天】重定向在Linux中改变命令I/O流向,默认有">"覆盖输出至文件及">>"追加输出至文件末尾,便于保存结果;使用"<"从文件读取输入而非键盘,高效处理数据。文件描述符如0(stdin)、1(stdout)、2(stderr)标识I/O资源,支持读写操作。管道以"|"连接命令,使前一命令输出成为后一命令输入,如排序用户或找出CPU占用最高的进程,构建复杂数据处理流程。
37 9
|
29天前
|
存储 Linux 数据处理
在Linux中,什么是管道操作,以及如何使用它?
在Linux中,什么是管道操作,以及如何使用它?
|
1月前
|
Linux
Linux源码阅读笔记13-进程通信组件中
Linux源码阅读笔记13-进程通信组件中
|
1月前
|
消息中间件 安全 Java
Linux源码阅读笔记13-进程通信组件上
Linux源码阅读笔记13-进程通信组件上
|
1月前
|
存储 Unix Linux
Linux I/O 重定向与管道
【8月更文挑战第14天】输出重定向可将命令结果存入文件,如`>`覆盖写入或`>>`追加写入。输入重定向从文件读取数据,如`<`代替键盘输入。这些操作利用文件描述符(如0:stdin, 1:stdout, 2:stderr)管理I/O。管道`|`连接命令,使前一命令输出作为后一命令输入,便于数据处理,如排序用户`sort -t: -k3 -n /etc/passwd | head -3`或查找CPU占用高的进程`ps aux --sort=-%cpu | head -6`。
22 4
|
19天前
|
开发者 API Windows
从怀旧到革新:看WinForms如何在保持向后兼容性的前提下,借助.NET新平台的力量实现自我进化与应用现代化,让经典桌面应用焕发第二春——我们的WinForms应用转型之路深度剖析
【8月更文挑战第31天】在Windows桌面应用开发中,Windows Forms(WinForms)依然是许多开发者的首选。尽管.NET Framework已演进至.NET 5 及更高版本,WinForms 仍作为核心组件保留,支持现有代码库的同时引入新特性。开发者可将项目迁移至.NET Core,享受性能提升和跨平台能力。迁移时需注意API变更,确保应用平稳过渡。通过自定义样式或第三方控件库,还可增强视觉效果。结合.NET新功能,WinForms 应用不仅能延续既有投资,还能焕发新生。 示例代码展示了如何在.NET Core中创建包含按钮和标签的基本窗口,实现简单的用户交互。
43 0
|
24天前
|
消息中间件 Linux
Linux0.11 管道(十一)
Linux0.11 管道(十一)
15 0
|
29天前
|
数据挖掘 Linux 应用服务中间件
在Linux中,如何在Linux中使用管道?
在Linux中,如何在Linux中使用管道?
|
30天前
|
存储 Linux 数据处理
在Linux中,管道(pipe)和重定向(redirection)的是什么?
在Linux中,管道(pipe)和重定向(redirection)的是什么?