进程之间的通信———管道
一:管道的基本概念:
进程之间的通信的本质是让不同的进程看到一份公共的资源(有内核提供)。而管道是一种最基本的IPC机制,又pipe函数创建。
调用pipe函数时在内核中开辟一块缓冲区(称为管道),它有一个读端一个写段,然后通过fileds参数传出给用户程序两个文件描述符,fileds[0]指向管道的读端,fileds[1]指向管道的写端。
管道通信的特点:
1,管道只能进行单向通信。
2,管道只能够用于进行具有血缘关系的进程之间进行进程间通信,常用于父子。
3,管道内部自带同步机制。
4,管道在进行通信的时候我们一般而言,管道对外界提供的服务叫做面向字节流的通信。
5,当其管道与之相应的进程退出时,管道也随之释放,我们把管道的生命周期叫做随进程。
管道之间进行通信的程序:
用图来说明上段代码:
但是管道存在四种情况:(1)如果写端不写了,但是不管端口,那么读端就会等着(2)如果写端一直写,读端不读,那么当写满之后就会停止不写,直到读端读了数据(3)如果只读不写,当读端读完数据也会等着(4)如果读端关了,一直写的话是无效的,因为操作系统会关掉管道。其中2和3两种情况说明管道自带同步。
多个执行流访问同一份资源叫做临界资源,访问公共资源的那份代码叫做临界区。
互斥:在任意一个时候,只能有一个人访问临界区,操作临界资源,一般而言,互斥都是采用原子性状态进行访问,但是又有一个优先级问题,所以一个进程长时间去申请某个资源,但是因为某个场景下,该进程长时间得不到满足就会导致该进程出现饥饿问题。
二:命名管道
命名管道是一个设备文件,所以即使是没有血缘关系的两个进程之间也可以通过命名管道进程通信。
linux下有两种方式创建命名管道,一种是在shell下交互地建立一个命名管道,二是在程序中使用系统函数建立命名管道。Shell方式下可以使用mknod或mkfifo命令,下面命令使用mknod创建一个命名管道:mknod namedpipe