进程间通信与管道
通信的目的:达成多进程的协同
数据传输
资源共享
通知事件
进程控制
进程间通信的本质:让不同的进程先看到同一份资源(通常由OS提供)
子进程拷贝父进程的fd表,fd表指向的文件属于文件操作,不需要拷贝,父子fd表指向同一个文件。
管道只允许单向通信
我们如何让不同的进程看到同一个文件管道?
根据父子进程的创建。
管道 pipe
什么是管道?
进程间通信的功能
将一个进程连接到另一个进程的一个数据流称为管道
父进程在对一个文件进行读写操作时会分配两个file_struct分别管理读和写文件,子进程拷贝父进程的fd表也指向这两个fd[0] fd[1],当管道建立好,父进程关闭自己的写权限,子进程关闭自己的读权限,此时形成子写父读的管道。
匿名管道
int pipe[int fd[2]]
fd[2]:输出型参数,以读和写分别创建2个struct file文件
创建管道
第一步:建立管道
第二步:让父进程创建子进程
第三步:父子关闭不需要的fd,形成单向通信的管道
为什么一定要用通道,父子进程不是也可以形成数据交换?
父进程给子进程的数据是不可变化的,而且只能是父进程给子进程,而管道可以形成变化的相互通信
a.管道的四种情况
1.如果管道没有数据了,读取端必须等待直到有数据为止(写段写入数据)
2.如果管道被写满了,写端必须等待,直到有空间为止(读端读走数据)
3.写段关闭,读端一直读取,读端会读到read返回值为0,表示读到文件的结尾
4.读端关闭,写端一直写入,OS会直接杀掉写端进程,向目标发送SIG
b.管道的五种特性
1.匿名管道,可以允许具有血缘关系的进程之间进行进程间通信,常用于父子,仅限于此。
2.匿名管道给读写端提供同步机制
3.匿名管道是直接面向数据流的
4.管道的生命周期是随进程的
5.管道是单向通信的,半双工通信(一个人说,一个人听)的一种特殊情况
管道大小?
ulimit -a