进程间通信
1.进程间通信介绍
1.1为什么会有进程间通信?
- 每一个进程都是拥有自己独立的虚拟地址空间和页表结构,促使了进程独立,同时带来了进程和进程之间相互协作的问题。所以就引入了进程间通信,而最大的进程间通信叫网络
1.2进程间通信的目的
- 数据传输:一个进程需要将它的数据发送给另一个进程
- 资源共享:多个进程之间共享同样的资源
- 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)
- 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变
2.进程间通信——管道
2.1管道的引入
2.2什么是管道呢?
2.2管道——匿名管道
2.2.1创建匿名管道的接口
2.2.2匿名管道的特性
2.2.2.1匿名管道只能用于具有亲缘关系的进程之间
- 所以管道的数据流是一个方向,数据流只能从写端到读端,所以管道是一个半双工通信(要么A给B说,要么B给A说)
2.2.2.2匿名管道是提供字节流服务的
- 提供字节流服务的意思就是,比如说读入,我们可以读
hello-world
也可以读world
,类似这种读入数据的行为
2.2.2.3管道的大小是64K(65536)
- 此时读写的过程都是基于文件描述符是
阻塞属性
的
2.2.2.4创建匿名管道返回的文件描述符属性默认是阻塞的
2.2.2.5 如何将文件描述符设置为非阻塞的呢?
-
我们有一个
fcntl
函数
-
函数的返回值是文件描述符的属性,使用的是位图的方式
-
若要设置非阻塞属性时,著需要给原来的属性按位或
O_NUNBLOCK
-
我们可以在如下这个文件当中查看对应的属性的定义
-
结合我们之前学到的
read
和write
我们来看看两个读和写的二进制码
-
这就和上面的二进制码对上了,和
O_NUNBLOCK
按位或就将文件属性改成了非阻塞