【Linux】管道实现通信

目录

管道的原理:

管道的规则:

匿名/命名:


管道的原理:

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

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

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

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

管道的规则:

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

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

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

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

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

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

匿名/命名:

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

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值