news 2026/4/21 17:34:40

嵌入式第三十九篇——linux系统编程——信号通信、共享内存

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
嵌入式第三十九篇——linux系统编程——信号通信、共享内存

一、信号通信

信号是 Linux/Unix 中用于异步通知进程的机制,可处理随机事件(如用户按下Ctrl+C、进程出错等)。

1. 信号的核心工作流程

  1. 信号产生:由随机事件触发(如用户操作、系统调用、硬件异常)。
  2. 信号传递:Linux 内核接收信号请求,在进程控制块(PCB)中根据 PID 找到目标进程。
  3. 信号处理:目标进程暂停原有工作流程,执行 PCB 中信号对应下标的处理函数(如信号 2 对应handle2)。
  4. 恢复执行:信号处理函数执行完毕后,进程回到原有代码继续运行。

2. 核心函数接口

(1)发送信号:kill
#include <signal.h> #include <sys/types.h> int kill(pid_t pid, int sig);
  • 功能:向指定 PID 的进程发送编号为sig的信号。
  • 参数
    • pid:目标进程的 PID(特殊值:pid>0指定进程;pid=0同组进程;pid=-1所有有权限的进程;pid<-1组 ID 为|pid|的进程)。
    • sig:信号编号(可通过kill -l查看所有信号,如SIGINT=2、SIGKILL=9)。
  • 返回值:成功返回 0,失败返回 - 1(设置errno)。
(2)捕获 / 自定义信号处理:signal
#include <signal.h> // 函数原型(简化版:sighandler_t为函数指针类型) typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);
  • 功能:为编号signum的信号设置处理函数。
  • 参数
    • signum:要处理的信号编号。
    • handler:信号处理方式,可选:
      • SIG_DFL:使用默认处理(如SIGINT默认终止进程)。
      • SIG_IGN忽略信号(如忽略SIGINTCtrl+C无效)。
      • 自定义函数指针:执行用户自定义的处理逻辑(函数参数为信号编号)。
  • 返回值:成功返回之前的信号处理函数指针,失败返回SIG_ERR(设置errno)。

3. 常用信号

信号编号信号名触发场景默认处理
2SIGINT用户按下Ctrl+C终止进程
9SIGKILL强制终止进程终止进程(不可捕获 / 忽略)
15SIGTERMkill默认发送的信号终止进程
17SIGCHLD子进程退出 / 终止忽略

二、System V 共享内存

共享内存是 System V 标准提供的 ** 进程间通信(IPC)** 方式,是最快的 IPC 机制(直接操作内存,无数据拷贝)。

1. 核心特性(与管道对比)

特性共享内存管道(无名 / 有名)
读写权限双方均可读写(双向)半双工(无名管道)/ 全双工(有名管道)
阻塞机制无读阻塞、无写阻塞读阻塞(无数据)、写阻塞(缓冲区满)
数据留存数据持久化(不主动删除则保留)数据读取后即被销毁
配套使用需与信号 / 信号量集搭配(实现同步互斥)自带阻塞机制,可独立使用
内存形态连续内存区域(类似字符数组)内核缓冲区

2. 共享内存的操作流程

申请键值(ftok)→ 创建/获取共享内存(shmget)→ 映射到进程地址空间(shmat)→ 读写操作 → 解除映射(shmdt)→ 删除共享内存(shmctl)

3. 核心函数接口

(1)生成唯一键值:ftok
#include <sys/types.h> #include <sys/ipc.h> key_t ftok(const char *pathname, int proj_id);
  • 功能:通过文件路径和项目 ID 生成唯一的 System V IPC 键值(用于关联共享内存对象)。
  • 参数
    • pathname:任意存在且不被删除重建的文件路径(如./test.file)。
    • proj_id:整形数字(通常用 ASCII 单字符,如'a'=97,仅低 8 位有效)。
  • 返回值:成功返回唯一键值(key_t),失败返回 - 1(设置errno)。
(2)创建 / 获取共享内存:shmget
#include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, size_t size, int shmflg);
  • 功能:向内核申请共享内存对象(创建新对象或获取已有对象)。
  • 参数
    • key:由ftok生成的唯一键值(特殊值IPC_PRIVATE:创建私有共享内存,仅父子进程可用)。
    • size:申请的共享内存大小(单位:字节,建议为页大小的整数倍,页大小通常为 4096 字节)。
    • shmflg:权限标志,组合使用:
      • 八进制权限(如0664,同文件权限)。
      • IPC_CREAT:若不存在则创建新共享内存。
      • IPC_EXCL:与IPC_CREAT搭配,若已存在则返回错误(确保创建新对象)。
  • 返回值:成功返回共享内存 ID(shmid),失败返回 - 1(设置errno)。
(3)映射共享内存到进程地址空间:shmat
#include <sys/types.h> #include <sys/shm.h> void *shmat(int shmid, const void *shmaddr, int shmflg);
  • 功能:将内核中的共享内存映射到进程的本地虚拟地址空间。
  • 参数
    • shmid:由shmget返回的共享内存 ID。
    • shmaddr:指定映射的本地地址(通常设为NULL,由系统自动分配)。
    • shmflg:映射权限(0:读写;SHM_RDONLY:只读)。
  • 返回值:成功返回映射后的内存地址,失败返回(void*)-1(设置errno)。
(4)读写共享内存

共享内存映射后可直接通过指针操作,常用函数:

  • 字符串操作strcpystrcatstrcmp(适用于字符串数据)。
  • 二进制数据操作memcpy(适用于结构体、数组等二进制数据)。
(5)解除映射:shmdt
#include <sys/types.h> #include <sys/shm.h> int shmdt(const void *shmaddr);
  • 功能:将进程的本地地址与共享内存断开映射关系(并非删除共享内存)。
  • 参数shmaddrshmat返回的映射地址。
  • 返回值:成功返回 0,失败返回 - 1(设置errno)。
(6)控制 / 删除共享内存:shmctl
#include <sys/ipc.h> #include <sys/shm.h> int shmctl(int shmid, int cmd, struct shmid_ds *buf);
  • 功能:修改共享内存属性或删除共享内存对象。
  • 参数
    • shmid:共享内存 ID。
    • cmd:操作命令(常用IPC_RMID:删除共享内存对象;IPC_STAT:获取属性;IPC_SET:设置属性)。
    • buf:指向shmid_ds结构体的指针(IPC_RMID时设为NULL即可)。
  • 返回值:成功返回 0,失败返回 - 1(设置errno)。

3. 常用命令(管理共享内存)

命令功能
ipcs -a查看所有 System V IPC 对象(共享内存、信号量、消息队列)
ipcs -m仅查看共享内存
ipcrm -m <shmid>删除指定 ID 的共享内存
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/21 7:00:37

Electron 文件系统与数据存储

Electron 中的文件系统与数据存储 Electron 作为基于 Chromium 和 Node.js 的桌面应用框架&#xff0c;允许开发者直接访问本地文件系统和多种数据持久化方式。这使得 Electron 应用可以像传统桌面软件一样处理文件读写、配置保存和数据管理。下面详细说明常见方式。 1. 文件…

作者头像 李华
网站建设 2026/4/5 23:49:20

Electron 性能优化

Electron 中的性能优化 Electron 应用性能问题常见于启动慢、内存占用高、UI 卡顿和 CPU 消耗大。官方文档强调&#xff1a;性能优化的核心是反复剖析&#xff08;profiling&#xff09;代码&#xff0c;找出瓶颈并针对性优化&#xff08;如 VS Code 和 Slack 的实践&#xff…

作者头像 李华
网站建设 2026/4/1 17:45:13

Electron 打包与分发

Electron 中的打包与分发 打包是将 Electron 应用从开发环境转换为可分发的独立桌面安装包的过程&#xff08;Windows: .exe/.msi&#xff1b;macOS: .dmg/.app&#xff1b;Linux: .deb/.rpm/.AppImage&#xff09;。官方推荐使用成熟的打包工具&#xff0c;避免手动操作。以下…

作者头像 李华
网站建设 2026/4/8 15:58:24

企业级宠物商城网站管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】

摘要 随着社会经济的发展和人们生活水平的提高&#xff0c;宠物行业逐渐成为新兴的经济增长点。宠物商城作为宠物产业链中的重要环节&#xff0c;其线上化、智能化管理需求日益增长。传统的宠物商城管理系统存在功能单一、扩展性差、用户体验不佳等问题&#xff0c;难以满足现代…

作者头像 李华
网站建设 2026/4/18 14:09:26

企业级扶贫助农系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】

摘要 背景相关&#xff1a; 随着乡村振兴战略的深入推进&#xff0c;数字化技术在扶贫助农领域的应用日益广泛。传统扶贫模式存在信息不对称、资源分配不均、管理效率低下等问题&#xff0c;亟需通过信息化手段提升扶贫工作的精准性和可持续性。企业级扶贫助农系统通过整合互联…

作者头像 李华
网站建设 2026/4/16 20:54:26

信息管理毕设2026开题汇总

1 引言 毕业设计是大家学习生涯的最重要的里程碑&#xff0c;它不仅是对四年所学知识的综合运用&#xff0c;更是展示个人技术能力和创新思维的重要过程。选择一个合适的毕业设计题目至关重要&#xff0c;它应该既能体现你的专业能力&#xff0c;又能满足实际应用需求&#xff…

作者头像 李华