管道的原理:
我们知道每个进程都是独立的,如果想要两个进程保持独立性的同时,还能够直接通信,那将会很麻烦,所以一般我们采用的都是间接的方法。
比如一个商场里面,一家店搞促销,举办了一个抽奖的活动,买了多少元的物品后可以来抽奖,老板把奖品的名字都写在一个个卡片上,放到了一个只有上端开口的盒子里面,路人从里面拿去一个卡片兑奖。
大家看到这里的老板和路人就相当于是两个进程,现在他们呢看到了同一份资源--盒子,他们通过盒子 输入/读取 信息,最终拿到信息。一样的道理,在Linux中进程间的通信都是要让两个进程看到同一份资源,fork()函数是一个创建子进程的函数,我们在用fork()函数打印信息的时候,为什么和我们的父进程打印的信息显示在同一个终端上,也就是此时我们的父子进程都能看到这一份文件,才能往里面打入信息。
我们创建一个文件,系统会从磁盘拿属于这个文件的文件信息放进去,我们的进程的内部有一份tast_struct 和 struct file *array[] ,这个数组是一个存放文件指针的映射表,我们的进程可以在这张表中可以找到自己想要的文件,fork()的时候,这张表也会被拷贝,这张表的0、1、2 正对应着输入、输出、错误这三个流,所以子进程透过这张表看到的文件是和父进程一样的
管道的规则:
管道必须是单向的,一个进程是读那么另一个就必须是写
我们在读取的时候,如果管道为空,那么进程会进入管道资源的等待队列
写入的时候,如果管道是满的,也是一样的道理
一般而言,进程退出,管道释放,所以管道的生命随周期随进程
管道是半双工的,数据只能向一个方向流动,想要双方通信,需要建立两个管道
每个被打开的文件都有一个属于的引用计数,每有一个进程关闭这个文件,引用计数减减,为0,自动释放
匿名/命名:
匿名管道:子进程继承父进程
命名管道:通过一个fifo文件,这个文件是具有唯一路径的,通过磁盘
这个是Linux下的接口,第二个参数是权限参数,设定前可以用umask设定默认权限