目录:
1.进程间通信的介绍
2.管道通信
3.管道的原理
-------------------------------------------------------------------------------------------------------------------------------
1.进程间通信的介绍
2.管道通信
当我们在创建子进程时,我们的父进程和子进程是两个独立的进程,它们两个有没有看到同一份资源呢??
看到了,就是一份文件,如果父进程写入自己的数据进对应的缓冲区当中不触发你的磁盘驱动的写入函数刷新到磁盘上,那么是不是另一个进程通过文件描述符找到同一个struct_file然后找到这个缓冲区的数据,是不是可以做到将一个进程的数据交给了下一个进程,这就是叫做让不同的进程看到了同一份资源,这种基于文件的通信方式,就是管道(一个进程往缓冲区里写数据,下一个进程往缓冲区里读数据)
3.管道的原理
但是管道是只能单向通信的通信通道!!!如果想实现双向通信就必须实现两个管道
我们的父子进程看到了同一份的公共资源(指的就是管道),这就是管道原理
为什么最开始的时候父进程在最开始的时候要以写方式和读方式打开一个文件呢??
也就是为什么父进程这里为什么要有两个文件描述符
一个行不行??要是父进程是以读方式打开,那么子进程继承下去就也只能读了,两个读端,父子进程还怎么实现通信!!!
那如果既以写方式和读方式打开呢??(C语言不是有rw方式打开文件嘛!!)
要是读写方式打开的话,只有一个文件描述符,这样子好像可以,可是要怎么关呢??
子进程继承下去也能读能写,可是管道只能是单向通信的,怎么关呢??没办法
-----------------------------------------------------------------------------------------------------------------------------
操作系统给我们提供一个系统调用,打开一个文件以写方式和读方式打开
接下来我们代码实现管道通信 -------------------------
我们管道创建成功了,接下来就是进行父子进程间通信了
我们先fork()创建子进程,之后在关闭读写端,实现单向通信
我们可以把0想象成嘴,把1想象成笔
------------------------------------------------------------------------------------------------------------------------------
这样子我们就是实现了让双方进程看到同一份资源
接下来就是通信了
上面我就做到了子进程把数据通过管道交给父进程 ---- 这就是管道通信
接下来我们再通过一些代码来推测,管道通信的特性!!
我们再来模拟一个小现象
发现当没有人读的时候,写满64kb的时候,写端就不在写入了------因为管道有大小
1024字节=1kb
-------------------------------------------------------------------------------------------------------------------------------
当我们的writer写满的时候,为什么不写了???
因为要让reader读端来读,不写了的本质是:是要等对方来读
那么我们就当写满的时候,再来读看看,通过一段代码来看看
管道自带同步机制 ---- 原子性写入
不仅仅我们的写端等我们的读端,我们的写端也可能等我们的读端---- 自带同步机制
--------------------------------------------------------------------------------------------------------------------------
如果我们的写端最终关闭了,那么我们的读端在读会读到文件结尾
--------------------------------------------------------------------------------------------------------------------------
当我们把读端关闭,写端还在写入,此时站在OS的层面,合理嘛???
严重不合理,我们已经没有人读了,你还在写入,本质就是在浪费操作系统的资源,OS会直接终止写入进程!!!!
可是操作系统给目标进程发送信号 SIGPIPE!!
-----------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------