71_进程之管道

管道:分为有名管道和无名管道,平时说管道是指默认的无名管道,

有名管道:也叫fifo,(无名管道就叫管道)

管道(无名管道)的本质是通过内核维护的一块内存通信

所有的进程之间是不可以直接通信的,跟内核是可以双向通信的,但是内核只有一个,

通信是内核中开辟的一块共用的内存。就像管道一样,

管道是单项通信的,二极管一样的

单工通信,二极管

半双工:同一时间只能是一个方向,但是这个方向是可变的

管道通信是半双工的,用一个管道设置一个双向的通信还是有些危险的,同一个时刻下,只有一个方向的管道能使用

缺陷是通信信息容易让别人抢走了

管道:单向通信有读端和写端,半双工的,只能在父子进程间的通信里面使用

父进程中,创建管道,然后再fork子进程,fork后子进程会继承父进程

71_进程之管道

输出型参数

创建管道借鉴了创建文件的操作方法,创建管道函数返回的是两个文件描述符,一个用来读,一个用来写

返回的就是都和写的文件描述符

关闭某一个方向的管道,就把管道的返回值清零

数组里面是读和写的描述符,返回的就是管道的描述符,然后父进程去创建子进程,子进程会继承父进程已经打开的文件描述符,此时,在父进程关闭读的,子进程关闭写的,此时就可以实现父进程写子进程读,也就是父进程给子进程发消息了。

此处用到五个函数,pipe(创建管道),fork(创建子进程),close(关闭父进程的读,关闭子进程的写),write(父进程写文件),read(子进程读文件),此处看管道像一个文件,这样就由半双工的改造成了单工的管道,这就是无名管道。

管道的限制:必须是父子进程间的通信。如果不是父子就没办法用管道,因为文件描述符是通过fork后子进程继承得来的

管道的半双工变单工是另一个缺陷。

有名管道(不是父子进程之间的通信):上一个看出来其实像是靠一个读写文件来进行通信,必须靠一个有名字的文件来维护的,A进程用一个mkfifo来创建一个文件,跟A的进程关联起来,B进程也去使用mkfifo将进程和文件关联起来,关联起来之后用open,write,read,close来进行进程间的通信,这个也是半双工的,也是自己把一对阉割掉,有名管道就是多了一个外在的有名字的文件,就是用这个有名字文件来关联两个进程(非父子的进程),父子进程比较好找关联不需要一个有名字的文件

毫无关系的这俩个进程使用文件靠什么接头呢?有名字的文件mkfifo的时候mk的是同一个文件,

一切皆是文件

fifo:先入先出,就是一个通道   两个口

stack是后进先出,一个口