2024年8月16日嵌入式学习
今日复习信号量的知识点和学习了进程间通信和管道
总结信息量:
共享进程资源 方便
线程 抢占公共资源 带来的问题
1. 互斥访问
需要互斥锁 来保障 原子性操作
使 操作过程 完整
互斥锁:
a.初始化 锁
b.加锁 //使用资源之前
c.解锁 //用完之后
d.销毁 锁
2. 有顺序的进行访问
信号量机制
资源的种类 资源的数量 如何抽象?
站在使用者的角度考虑
核心操作:
P操作 --- 申请资源
V操作 --- 释放资源
进程间通信
通信的7种方式:
//同一主机
1、古老的通信方式
管道:
无名管道 (1)
有名管道 (2)
信号 (3)
2、IPC对象通信 system v BSD suse fedora kernel.org
消息队列 (用的相对少,这里不讨论) (4)
共享内存(*) //最高效 (5)
信号量集() //信号量 (6)
//不同主机
3、socket通信
网络通信 (7)
管道
无名管道
int pipe(int pipefd[2]);
功能:
创建一个管道
参数:
@pipefd //用来获取 管道的两端 //读端pipefd[0]
//写端pipefd[1]
返回值:
成功 0
失败 -1 && errno
管道的特点
1.管道大小 65536字节 64k
2.管道操作特点
数据读走之后,认为就没了
//写端存在,读端也存在
管道如果为空,此时可以一直写,直到写满
//写端存在,读端不存在
此时,写操作,会导致管道破裂
SIGPIPE //这个信号会使得程序结束
//写端存在,读管道
可以读管道,但是管道中如果没有数据了,此时读操作 阻塞
//写端不存在,读管道
可以读管道,但是管道中如果没有数据了,此时读操作 不阻塞
管道的读写规则:
1.读端存在,写管道
管道空:可以写数据
管道满:会造成-->写阻塞
2.读端不存在,写管道
系统会给进程发一个信号SIGPIPE(管道破裂)
3.写端存在,读管道
管道空,读不到数据,
这时会造成读操作阻塞
4.写端不存在,读管道
如果管道中有数据,则读取这些数据!
如果没有数据,读操作不阻塞,立即返回!