系统编程 笔记8

-------------------------------------进程间通信-------------------------------------

进程间通信原理:进程对于用户空间是映射在多个区块的,但是因为内核空间只有一份所以可以利用这个特性在这个内核区创建一个缓冲区进行两个完全不相干的进程之间的信息交互。缓冲区一般大小为4096。

任何进程之间的全局变量在另一个进程中是看不到的,所以进程之间无法相互访问,如果需要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1将数据从用户空间拷贝到内核缓冲区,进程2再把内核缓冲区中的数据读走,内核提供的这种机制叫做进程间通信(IPC)。

现今常用的进程间通讯方法:
1.管道(使用最简单)
2.信号(开销最小)
3.共享映射区(mmp)(无血缘关系)
4.本地套接字(socket)(最稳定)

管道:
1.实质是一个伪文件,不会占用物理内存所以没有大小,占用的是内存(内核缓冲区)。
2.由两个文件描述符引用,一个表示读端,一个表示写端。
3.规定数据从管道的写端流入,从读端流出。
管道原理:管道实为内核使用环形队列机制,借助内核缓冲区(4k)实现。
局限性:
1.自己写,不能自己读
2.数据不能反复读
3.半双功通信
4.管道只能作用在有血缘关系的父子进程中。
pipe函数:
函数原型:int pipe(int pipefd[2]);
参数(规定死的):
f[0]:读端
f[1]:写端
返回值:
成功返回0
失败返回-1并且设置errno
功能:创建并打开管道(父和子进程是共享文件描述符的,所以在子进程创建出来时也有了读端和写端的文件描述符)。
所以父子进行之间的通讯只需要一方打开读端关闭写端,一方打开写端关闭读端就能实现数据的流通,也就是进程之间的通讯。(通过close()函数关闭)
管道读写行为:
读管道:
1.管道有数据。read返回实际读到的字节数
2.管道无数据:
1)无写端,read返回0//相当于读到了文件的末尾,直接返回。
2)写端没有完全被关闭,read阻塞等待(不久的将来会有数据到达,此时会让出CPU)
写管道:
1.管道读端全部被关闭,异常终止(由SIGPIPE导致)
2.有读端:
1)管道已满,write阻塞等待//等着数据被读走,然后往里写数据
2)管道未满,返回写出的字节个数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值