当前位置: 首页 > news >正文

自学嵌入式day35,信号和共享内存

信号通信

信号通信是一种异步通信机制,常用于处理随机事件和通知。发送和接收信号的过程如下:

  1. 当随机事件发生时,发送信号请求。
  2. Linux内核接收到信号请求后,在进程控制块(PCB)链表中查找目标进程的PID(例如1000)。
  3. 找到目标进程后,暂停其当前执行流程,调用PCB中信号处理函数对应的函数(例如,发送信号2时调用handle2)。
  4. 信号处理函数执行完毕后,进程恢复原代码的执行。
信号相关函数

发送信号函数

int kill(pid_t pid, int sig);
  • 功能:向指定PID的进程发送信号。
  • 参数
    • pid:目标进程的PID。
    • sig:信号编号(如kill -l列出的信号)。
  • 返回值
    • 成功:0。
    • 失败:-1。

信号捕获函数

sighandler_t signal(int signum, sighandler_t handler);
  • 功能:自定义或指定信号的处理方式。
  • 参数
    • signum:信号编号。
    • handler:处理函数宏或自定义函数:
      • SIG_DFL:默认处理。
      • SIG_IGN:忽略信号。
      • fun:自定义处理函数。
  • 返回值:成功时返回原处理函数指针,失败时返回SIG_ERR

共享内存

共享内存是一种基于System V的进程间通信(IPC)机制,允许多个进程访问同一块内存区域。

函数调用步骤
  1. 生成键值申请对象映射对象读写对象撤销映射删除对象
与管道的区别
  1. 读写权限:共享内存允许双方读写,管道通常单向。
  2. 阻塞机制:共享内存无读/写阻塞,需搭配信号或信号集同步。
  3. 数据结构:共享内存是初级内存区域(如字符数组),数据持久化。
相关函数接口

生成键值函数

key_t ftok(const char *pathname, int proj_id);
  • 功能:通过文件路径和ID生成唯一键值。
  • 参数
    • pathname:文件路径(需稳定存在)。
    • proj_id:整型ID(常用ASCII字符)。
  • 返回值
    • 成功:键值。
    • 失败:-1。

申请共享内存函数

int shmget(key_t key, size_t size, int shmflg);
  • 功能:申请共享内存对象。
  • 参数
    • key:唯一键值。
    • size:内存大小。
    • shmflg:权限标志(如IPC_CREATIPC_EXCL)。
  • 返回值
    • 成功:共享内存ID(shmid)。
    • 失败:-1。

映射共享内存函数

void *shmat(int shmid, const void *shmaddr, int shmflg);
  • 功能:将共享内存映射到本地地址空间。
  • 参数
    • shmid:共享内存ID。
    • shmaddr:本地地址(建议NULL由系统分配)。
    • shmflg:读写标志(0为读写,SHM_RDONLY为只读)。
  • 返回值
    • 成功:映射地址。
    • 失败:(void*)-1

读写操作

  • 使用memcpy()strcpy()进行数据读写。

撤销映射函数

int shmdt(const void *shmaddr);
  • 功能:断开共享内存映射。
  • 参数shmaddr:映射地址。
  • 返回值
    • 成功:0。
    • 失败:-1。

删除对象函数

int shmctl(int shmid, int cmd, struct shmid_ds *buf);
  • 功能:修改或删除共享内存对象。
  • 参数
    • shmid:共享内存ID。
    • cmd:命令宏(如IPC_RMID删除对象)。
    • buf:属性结构(建议NULL)。
  • 返回值
    • 成功:0。
    • 失败:-1。
相关命令
  • 查询对象ipcs -a(查看共享内存、信号量集、消息队列)。
  • 删除对象ipcrm -m(删除共享内存)。
http://www.cnnetsun.cn/news/178604.html

相关文章:

  • LangFlow与LangChain协同工作原理深度剖析
  • 16.2 对齐方法论:FineTune与RAG两大技术路径
  • 16.3 微调技术盘点:产品经理需要了解的核心方法
  • 汇编语言全接触-41.虚拟设备驱动程序初步
  • LangFlow能否实现专利文献摘要提取?科研情报处理
  • 告别熬夜爆肝:百考通AI如何用源码宝库与智能答辩重塑学习体验
  • AI赋能科研:百考通如何让学术起步更高效
  • LangFlow开源生态现状及未来发展方向预测
  • Open-AutoGLM自动化卡顿元凶分析(弹窗阻断深度解析与绕行策略)
  • 揭秘Open-AutoGLM运行时崩溃:为何弹窗错误始终无法捕获?
  • 【Open-AutoGLM加密传输协议配置】:掌握企业级安全通信的5大核心步骤
  • 2026毕设ssm+vue基于企业客户管理系统论文+程序
  • 【紧急故障应对】:Open-AutoGLM上线即超时?立即执行这6项止损操作
  • HoRain云--Java网络编程:BIO、NIO、AIO全解析
  • 基于java+ vue农产投入线上管理系统(源码+数据库+文档)
  • LangFlow能否用于构建智能客服质检系统?会话分析实践
  • Open-AutoGLM加载慢怎么办?3种高效优化策略立即见效
  • LangFlow能否用于构建AI心理咨询师原型?伦理边界探讨
  • Open-AutoGLM权限管理深度优化(90%开发者忽略的弹窗隐患)
  • 权限弹窗频发怎么办,一文掌握Open-AutoGLM无感授权处理方案
  • 12、便携式数字音频播放器选购指南
  • 20、数字音乐制作与优化全攻略
  • 9、Windows Vista数据安全与网络连接全攻略
  • 2、僵尸网络:行动的召唤
  • LangFlow中的冷启动问题缓解策略:默认模板推荐
  • LangFlow中的数据脱敏处理节点:隐私保护必备功能
  • 揭秘Open-AutoGLM跳转失败真相:3种高频场景的根治方案
  • LangFlow能否用于构建个性化推荐引擎?用户画像整合
  • 解决Open-AutoGLM手势无响应的5种高阶技巧,第3种极少人知道
  • LangFlow能否接入实时数据流?Kafka消息队列对接尝试