目录
无名管道
无名管道创建--pipe()
管道重点问题
无名管道读写规律
fcntl设置文件阻塞特性
文件描述符概述
文件描述符的复制-dup和dup2
dup函数
dup2
无名管道
进程间的通信,大部分都是使用内核空间进行操作,因为每一个进程的1G内核空间是相同的,而用户空间不同
有点像消息队列,我们在裸机编程的时候,两个函数(理解为两个进程)进行通信的话,我们常使用全局变量,如果换成管道的话,代码量增加,反正这种思维可以使用在裸机开发中去,但是至于会不会对开发有好处或者坏处,就不得而知了,因为两个函数(进程)通信的方式很多,如单纯使用全局变量、使用消息队列(压栈出栈)、还有这个管道,其实后面两个的原理很像
注意点:古老表示这种IPC很少使用,缺点多实用性不强。只能从一端读和写、数据是一次性的,一旦被读了就不存在了、只能在公共祖先的进程之间使用(因为它要求需要有血缘关系,可以理解为同一个进程的父子进程)
无名管道创建--pipe()
文件描述符就是优先最小未使用,只要我们拿到了文件描述符,那么就可以直接对文件进行写读操作---使用write和read
管道重点问题
先写入hello,再写入world,后面写入的数据不会覆盖前面写入的数据
读数据和写数据都会阻塞
场景:创建无名管道,然后fork(),子进程继承了无名管道的文件描述符,那么子进程就可以使用继承过来的文件描述符对管道进行操作了,注意继承的只是文件描述符其管道还是只有一个的,因此我们可以设定父进程收,子进程发。然后需要子进程对父进程进行收发的话,那么就需要创建两个管道了,但是这个新的管道跟之前的父进程没有关系,如何建立关系呢?那就是让新建的管道的文件描述符为之前的父进程的文件描述符
无名管道的创建在fork之前,如果在之后的话,父子进程创建的无名管道没有联系,那文件描述符相同吗?--可以实验一下
实现:父进程发,子进程收和发数据
无名管道读写规律
fcntl设置文件阻塞特性
通过前面讲的无名管道读写规律知,当管道没有消息时,read就会默认阻塞等待管道存在消息,那么阻塞等待对cpu是不太友好的,因此我们需要设定一下,如果没有消息,我不阻塞,那么就使用fcntl对文件进行配置一下
文件描述符概述
printf是向终端打印,如果你关闭了文件描述符1的话,那么printf就不能打印了,失去了功能
文件描述符的复制-dup和dup2
dup函数
dup2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)