千锋教育嵌入式物联网教程之系统编程篇学习-05

目录

无名管道

无名管道创建--pipe() 

 管道重点问题

 无名管道读写规律

fcntl设置文件阻塞特性

 文件描述符概述

文件描述符的复制-dup和dup2 

dup函数 

 dup2​

无名管道

进程间的通信,大部分都是使用内核空间进行操作,因为每一个进程的1G内核空间是相同的,而用户空间不同

千锋教育嵌入式物联网教程之系统编程篇学习-05_第1张图片

 有点像消息队列,我们在裸机编程的时候,两个函数(理解为两个进程)进行通信的话,我们常使用全局变量,如果换成管道的话,代码量增加,反正这种思维可以使用在裸机开发中去,但是至于会不会对开发有好处或者坏处,就不得而知了,因为两个函数(进程)通信的方式很多,如单纯使用全局变量、使用消息队列(压栈出栈)、还有这个管道,其实后面两个的原理很像

千锋教育嵌入式物联网教程之系统编程篇学习-05_第2张图片

 注意点:古老表示这种IPC很少使用,缺点多实用性不强。只能从一端读和写、数据是一次性的,一旦被读了就不存在了、只能在公共祖先的进程之间使用(因为它要求需要有血缘关系,可以理解为同一个进程的父子进程)

无名管道创建--pipe() 

千锋教育嵌入式物联网教程之系统编程篇学习-05_第3张图片

 文件描述符就是优先最小未使用,只要我们拿到了文件描述符,那么就可以直接对文件进行写读操作---使用write和read

 千锋教育嵌入式物联网教程之系统编程篇学习-05_第4张图片

 管道重点问题

先写入hello,再写入world,后面写入的数据不会覆盖前面写入的数据

千锋教育嵌入式物联网教程之系统编程篇学习-05_第5张图片

 读数据和写数据都会阻塞千锋教育嵌入式物联网教程之系统编程篇学习-05_第6张图片

场景:创建无名管道,然后fork(),子进程继承了无名管道的文件描述符,那么子进程就可以使用继承过来的文件描述符对管道进行操作了,注意继承的只是文件描述符其管道还是只有一个的,因此我们可以设定父进程收,子进程发。然后需要子进程对父进程进行收发的话,那么就需要创建两个管道了,但是这个新的管道跟之前的父进程没有关系,如何建立关系呢?那就是让新建的管道的文件描述符为之前的父进程的文件描述符 

 无名管道的创建在fork之前,如果在之后的话,父子进程创建的无名管道没有联系,那文件描述符相同吗?--可以实验一下

千锋教育嵌入式物联网教程之系统编程篇学习-05_第7张图片

实现:父进程发,子进程收和发数据 

 无名管道读写规律

千锋教育嵌入式物联网教程之系统编程篇学习-05_第8张图片

fcntl设置文件阻塞特性

通过前面讲的无名管道读写规律知,当管道没有消息时,read就会默认阻塞等待管道存在消息,那么阻塞等待对cpu是不太友好的,因此我们需要设定一下,如果没有消息,我不阻塞,那么就使用fcntl对文件进行配置一下

 千锋教育嵌入式物联网教程之系统编程篇学习-05_第9张图片

千锋教育嵌入式物联网教程之系统编程篇学习-05_第10张图片

 千锋教育嵌入式物联网教程之系统编程篇学习-05_第11张图片

 千锋教育嵌入式物联网教程之系统编程篇学习-05_第12张图片千锋教育嵌入式物联网教程之系统编程篇学习-05_第13张图片

 文件描述符概述

printf是向终端打印,如果你关闭了文件描述符1的话,那么printf就不能打印了,失去了功能

 千锋教育嵌入式物联网教程之系统编程篇学习-05_第14张图片

文件描述符的复制-dup和dup2 

 千锋教育嵌入式物联网教程之系统编程篇学习-05_第15张图片

dup函数 

 千锋教育嵌入式物联网教程之系统编程篇学习-05_第16张图片

 千锋教育嵌入式物联网教程之系统编程篇学习-05_第17张图片

 千锋教育嵌入式物联网教程之系统编程篇学习-05_第18张图片

 千锋教育嵌入式物联网教程之系统编程篇学习-05_第19张图片

 dup2千锋教育嵌入式物联网教程之系统编程篇学习-05_第20张图片

你可能感兴趣的:(#,linux系统编程,学习)