目录
一.通信背景
3.进程间通信目的
4.进程间通信发展
5.进程间通信分类
二.管道
1.匿名管道
(1)匿名管道原理
(2)匿名管道特点
(3)打开进程读写的系统接口:pipe
(4)管道的代码
1.进程是具有独立性的!——导致进程间想交互数据,成本会非常高
进程为什么要通信:需要多进程进行协同处理一件事情
2.不要以为,进程独立了,就是彻底独立,有时候,我们需要双方能够进行一定程度的信息交互
因为进程有独立性。
所以通信之前,我们需要让不同的进程看到同一份资源(文件,内存块..)
我们要学的进程间通信,不是告诉我们如何通信。而是解决:他们两个如何先看到同一份资源!
资源的不同决定了不同种类的通信方式!
第一种通信方式—>管道(提供共享资源的一种手段)
父进程写入文件的缓冲区,子进程去缓冲区里读,就实现了两个进程看到同一份资源,这个用于通信的内存级文件就叫做管道(普通级文件是为了保存数据到磁盘的)。struct file中有inode,inode中有一个联合体可以来表示自己是管道/块设备/文件/字符

都是单向的!
管道传输资源的——这个资源就是 数据
进程间通信管道——>单向的,传输数据的!
进程间通信管道是单向的过程图:

①为什么父进程要分别打开读和写? ——答:为了让子进程继承,让子进程不用再打开了!(如果父进程只是打开写,子进程也会继承写,那就没人读了,让子进程读的话还得再打开读)
②为什么父子要关闭对应的读写?——答:管道必须是单向通信的。父进程关闭读,子进程关闭写,就构成单向的父写子读了。
③谁决定,父子关闭什么读写? ——答:不是由管道本身决定的, 是由你的需求决定的!
man 2 pipe :pipe底层封装open,open了两次,第一次O_RDONLY,第二次O_WRONLY,把读写描述符分别放在数组pipefd[0],pipefd[1]。 返回值 0:成功,-1:失败

①当父进程没有写入数据的时候,子进程在等。所以,父进程写入之后,子进程才能read(会返回)到数据,子进程打印读取数据要以父进程的节奏为主!
②父进程和子进程读写管道的时候(是有一定的顺序性的!)。那么父子进程各自printf的时候,会有顺序吗?——答:无序。printf就是向显示器写入,也是文件,但是缺乏访问控制。
③父进程和子进程读写管道的时候:
——管道内部,没有数据,reader就必须阻塞等待(read),等管道有数据(阻塞等待就是当前进程的task_ struct 放入等待队列中,R->S/D/T)
——管道内部,如果数据被写满,writer就必须阻塞等待(write)等待管道中有空间
因为pipe内部自带访问控制机制——同步和互斥机制