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

进程间通信(信号、共享内存)

  • 一、信号
    • 信号是操作系统提供的一种进程/线程同步机制
    • 常用信号

  • 管理员信号:只能按照默认方式处理,不能够被忽略和捕获
    • 9) SIGKILL
    • 19)SIGSTOP
  • 信号处理方式
    • 缺省:按照默认处理方式处理
    • 忽略:不处理
    • 捕获:以自定义方式处理
  • signal:注册一个信号
  • #include <signal.h>
  • typedef void (*sighandler_t)(int);
  • sighandler_t signal(int signum, sighandler_t handler);
    • 功能:设置信号的处理方式(注册一个信号)
    • 参数:
      • signum:要处理的信号的编号;
      • handler:
        • SIGIGN:以忽略方式处理该信号(不处理)
        • SIG_DFL:以缺省方式处理(系统默认方式)
        • 函数的地址:以捕获方式处理(自定义)
    • 返回值:失败:NULL;自定义方式:返回自定义的函数入口地址
  • void (*sighandler_t)(int signum);
    • sighandller_t:执行信号任务处理函数的入口
    • 参数:signum:触发该任务函数的信号

  • 注意:
    • 若信号不被注册,则按照默认方式处理
    • 信号只需注册一次即可;
    • 每次信号的到来都会触发一次信号任务处理函数;
    • 信号尽可能早注册
  • 发送命令
    • kill命令
    • 函数kill()
      • int kill(pid_t pid, int sig);
      • 功能:给指定的进程发送一个信号
      • 参数:pid:接收信号的进程PID;sig:信号的编号
      • 返回值:成功:0;失败:-1
    • 子进程结束时,会发送SIGCHLD信号给父进程(子进程空间异步回收:通过子进程发送的SIGCHLD信号实现)
    • int raise(int sig),给自己所在的进程发送信号
    • unsigned int alarm(unsigned int seconds)
      • 功能:设置一个闹钟,当闹钟时间到达时,向自己所在的进程发送一个SIGALRM的信号
      • 参数:seconds:设置的闹钟的定时时间
      • 返回值:成功返回上次设定剩余的时间;上次未设定则返回0
    • pause();
      • 功能:让一个进程挂起(进入到睡眠状态)
      • 注意:pause可以被一个信号唤醒;这个信号必须要被捕获
  • 二、共享内存
    • 进程间效率最高的通信方式
    • 通信原理
      • 内核创建共享内存区域
      • 进程将共享内存映射到自己的地址空间
      • 进程通过指针直接访问共享内存
    • 核心特点
      • 零拷贝​:数据不需要在内核和用户空间之间复制
      • 直接访问​:进程可以直接读写内存区域
      • 高速通信​:比管道、消息队列等快一个数量级
      • 需要同步​:必须配合同步机制使用(信号量IPC)
    • 操作流程
      • 创建一个IPC key
        • key_t ftok(const char *pathname, int proj_id)
          • 功能:创建一个IPC key
          • 参数:pathname:路径;proj_id:工程ID
            • 注意:两个进程在创建key时必须使用相同的参数
          • 返回值:成功:IPCkey;失败:-1
      • 创建共享内存
        • int shmget(key_t key, size_t size, int shmflg)
          • 功能:创建一个共享内存
          • 参数:key:IPC key;size:共享内存大小,会被扩展成PAGE_SIZE的整数倍;shmflg::IPC_CREAT|0664
          • 返回值:成功:共享内存的ID;失败:-1
      • 建立共享内存段和用户空间的内存映射
        • void *shmat(int shmid, const void *shmaddr, int shmflg)
          • 功能:建立共享内存内存映射
          • 参数:shmid:共享内存id;shmaddr:映射的用户空间首地址;NULL:让操作系统分配;shmflg:
          • SHM_RDONLY:只读
          • !SHM_RDONLY:可读可写
          • 返回值:成功:映射的用户空间首地址;失败:(void*)-1
      • 向共享内存写入数据--->通过用户空间的首地址
      • 解除映射关系
        • int shmdt(const void *shmaddr)
          • 功能:解除内存映射关系
          • 参数:shmaddr:要解除的用户空间首地址
          • 返回值:成功:0;失败:-1
      • 删除共享内存
        • int shmctl(int shmid, int cmd, struct shmid_ds *buf);
          • 功能:操作共享内存
          • 参数:shmid:要操作的共享内存id;cmd:要执行的操作指令(IPC_RMID:删除操作);buf:设置的参数
          • 返回值:成功:0;失败:-1
  • 消息队列
    • 和管道相似,有同步效果
    • 增加数据的优先级(优先级数越小,优先级越高)
  • 信号量集:进程间通信
    • 实现进程间同步
http://www.dtcms.com/a/339509.html

相关文章:

  • 17.web api 8
  • STM32之beep、多文件、延迟、按键以及呼吸灯
  • 大模型部署基础设施搭建 - LlamaFactory
  • Java优选算法——滑动窗口
  • Fragment重要知识点总结
  • CloudDM 新增支持 GaussDB 与 openGauss:国产数据库管理更高效
  • OpenHarmony 之多模态输入子系统源码深度架构解析
  • Android -登录注册实践技术总结
  • 2025最新华为云国际版注册图文流程-不用绑定海外信用卡注册
  • 延时任务定时器的实现
  • Python 新工具 uv
  • 读《精益数据分析》:营收(Revenue)—— 设计可持续盈利模式
  • 【ASP.NET Core】ASP.NET Core中间件解析
  • sfc_os!SfcQueueValidationRequest函数分析之sfc_os!IsFileInQueue
  • 关闭VSCode Markdown插件在Jupyter Notebook中的自动预览
  • 在linux系统中下载Andconda
  • windows电脑对于dell(戴尔)台式的安装,与创建索引盘,系统迁移到新硬盘
  • Vim 编辑器使用指南
  • Java I/O 模型精讲:从传统BIO到高性能NIO与AIO
  • uv与conda的区别及选择指南
  • Linux软件编程:进程与线程(进程(消息队列、共享内存、信号灯))
  • 决策树二-泰坦尼克号幸存者
  • 微服务集训整理
  • AI赋能市场拓展:从智能潜力洞察到渠道精准深耕,解锁商业增长新蓝海
  • 【Proteus仿真】【51单片机】基于51单片机密码锁
  • 优秘企业智脑 AISEO 实战:如何通过多模态大模型提升搜索引擎排名?附 3 大行业案例
  • pytorch学习笔记-argparse的使用(加更版)
  • 基于SpringBoot+Vue的写真馆预约管理系统(邮箱通知、WebSocket及时通讯、协同过滤算法)
  • 哪些仪器适合对接电子实验记录本,哪些不适合?
  • Java 11中的Collections类详解