嵌入式系统方向学习笔记12

本文档详细介绍了嵌入式系统中进程间通信(IPC)的各种方法,包括管道(无名与有名)、信号、共享内存和消息队列。重点讲解了它们的应用场景、工作原理和注意事项,特别强调了数据传输、实时共享和进程控制的实践应用。
摘要由CSDN通过智能技术生成

笔记系列

嵌入式系统方向学习笔记8
嵌入式系统方向学习笔记9
嵌入式系统方向学习笔记10
嵌入式系统方向学习笔记11


进程通信


一、进程间通信(IPC)

进程间通信(IPC)方式
管道:有名管道和无名管道
消息队列
信号量
共享内存
套接字

进程间通信的目的:
1. 数据传输:几M字节
2. 共享数据:多个进程立刻看到数据保证实时性
3. 通知事件:一个进程向其他进程发送消息通知发生了某种事件(如如进程终止时通知父进程)
4. 资源共享:多个进程之间共享同样的资源。(需要内核提供锁和同步机制)
5. 进程控制

二、管道通信

1.无名管道

无名管道:一端写,一端读
管道是半双工,数据只能向同一个方向流动,需要双方通信时
Int pipe(),

在这里插入图片描述
在这里插入图片描述

0是读 1是写

必须在系统调用fork前调用pipe,否则子进程不会继承文件描述符
1. 如果管道的写端不存在,则认为已经读到了数据末尾,该函数返回的读出字节数为0
2. 当管道写端不存在,如果请求的字节数目大于PIPE_BUF(一个宏),则返回现有的数据字节数;如果不大于,则返回现有数据字节数或请求字节数

2.有名管道

mkfifo()
mode:O_WRONLY|O_RDONLY
在这里插入图片描述

3.管道通信总结

  1. 传输数据少,因此只适合小数据量的传输
  2. 管道数据被读出时会自动删除
  3. 管道数据输出格式?

三、信号

软中断(程序间传输信息的媒介)
查看信号 kill -l

Ctrl z:终止信息
Ctrl c:暂停信息

Int kill (pid_t pid,int sig);

信号处理
Sighhandler_t signal(int signnum, sighandler_t)
---------------------------- 信号编号,信号处理机制

SIG_IGN(忽略信号)
SIG_DFL(信号直接处理)

四、共享内存

无格式
当数据量大且读写效率要求较高的时候使用(读写效率高减少了进出内核的次数)

内核的实现原理:
在内存中开辟一块内存可以让多个进程共享
如果一个进程对于共享内存的内容进行了更改,其他进程都会受到影响
一个共享内存的最大容量:shnmax
posix: 系统v

开辟共享内存
Int shmget(key_t key, size_t size,int shmflg)
共享内容键值:0
IPC_PRIVATE:创建一块新的共享内存
返回值shmid:共享内存的标识符
shmflg:IPC_CREAT
映射共享内存:
shmat: void *shmat(int shmid, const void *shmaddr, int shmflg);
决定以什么方式来确定映射的地址,一般为0

过程:
1. 进程调用shmget函数创建新的或获取已有的共享内存
2. 调用shmat函数将物理内存映射到自己的进程空间
3. 调用shmdt函数取消映射
4. 调用shmtl函数释放开辟的物理空间

五、消息队列

传递有格式的消息流
多进程网状交叉通信,实现大规模数据通信
使用内核中的链表(实现机制)

消息队列是随内核持续的


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌&M~F

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值