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

day32-进程与线程(5)

5.消息队列
 1.IPC对象

  ①IPC对象理解为一种内存文件

  ②IPC对象在操作系统关闭的情况下数据被回收掉

  ③IPC对象可以通过文件系统来定位

  ④每个IPC对象可以创建一个消息队列、一个共享内存、一个信号灯

 2.IPC对象操作命令

  ⑴.查看IPC对象

    ●ipcs

    ●ipcs -q/m/s

  ⑵.删除IPC对象

    ●ipcrm

    ●ipcrm -q/m/s       消息队列/共享内存/信号灯的ID

    ●IP从入门-Q/M/S   IPC对象的key值

 3.操作流程

  ⑴创建/打开消息队列

  ⑵向消息队列中发送消息

  ⑶从消息队列中接收消息

 4.函数接口

  ●ftok

①原型:key_t ftok(const char *pathname, int proj_id);

②功能:根据pathnameproj_id生成IPC对象名称

③参数

pathname:路径
proj_id:项目ID8位)

④返回值

成功返回创建的IPC对象的名称
失败返回-1

  ●msgget

①原型:int msgget(key_t key, int msgflg);

②功能:根据key值创建消息队列

③参数

key:IPC对象的名称
msgflg:创建标志
     IPC_CREAT    不存在创建
     IPC_EXCL       存在报错

④返回值

成功返回消息队列ID
失败返回-1

  ●msgsnd

①原型:int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

②功能:向消息队列中发送消息

③参数

msqid:消息队列的ID
msgp:发送消息内容空间的首地址
msgsz:发送消息内容的大小
msgflg:发送消息的标志

④返回值

成功返回0
失败返回-1

  ●msgrcv

①原型:ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);

②功能:从消息队列中接收消息

③参数

msgqid:消息队列的ID
msgp:存放消息空间的首地址
msgsz:最多接收消息的大小
msgtyp:接收消息的类型

④返回值

成功返回实际拷贝到空间的字节数
失败返回-1

  ●msgctl

①原型:int msgctl(int msqid, int cmd, struct msqid_ds *buf);

②功能:删除消息队列

③参数

msqid:消息队列的ID
cmd:IPC_RMID 删除类型
buf:默认为NULL

④返回值

成功返回0
失败返回-1
6.共享内存
 1.概念:

   ①进程空间是独立的,共享内存是开辟一段内核空间,进程都映射到这一片空间上,实现空间的共享

   ②进程间通信最高效形式

 2.操作方法

   ⑴创建IPC对象名称

   ⑵创建共享内存

   ⑶将进程空间地址映射到共享内存空间中

   ⑷读写共享内存空间实现进程间通信

   ⑸解除共享内存映射

   ⑹删除共享内容

 3.函数接口

   ●ftok

   ●shmget

①原型:int shmget(key_t key, size_t size, int shmflg);

②功能:创建共享内存

③参数

key:IPC对象的键值
size:共享内存空间大小
shmflg:IPC_CREAT     不存在创建
           IPC_EXCL        存放报错

④返回值

成功返回共享内存的ID
失败返回-1

   ●shmat

①原型:void *shmat(int shmid, const void *shmaddr, int shmflg);

②功能:将进程空间中的地址映射到共享内存中

③参数

shmid:共享内存的ID
shmaddr:
          NULL:系统选择一个合适的地址进行映射
shmflg:
          标志默认为0

④返回值

成功返回映射到共享内存空间中的地址
失败返回NULL

   ●shmdt

①原型:int shmdt(const void *shmaddr);

②功能:解除映射

③参数

shmaddr:映射到共享内存空间中的地址

④返回值

成功返回0
失败返回-1

   ●shmctl

①原型:int shmctl(int shmid, int cmd, struct shmid_ds *buf);

②功能:向共享内存发送命令

③参数

shmid:共享内存ID
cmd:命令
         IPC_RMID 删除共享内存
buf:
         默认为NULL

④返回值

成功返回0
失败返回-1
7.信号灯
 1.概念:

   ①搭配共享内存实现进程间的通信

   ②主要用于多进程任务间的同步

   ③信号灯是一组信号量,即信号量的数组

   ④用于线程间通信的信号量称为无名信号量,信号灯是有名信号量

 2.信号灯操作:

   ①创建信号量数组

   ②申请信号量

   ③释放信号量

   ④信号量的销毁

 3.函数接口

   ●ftok

   ●semget

①原型:int semget(key_t key, int nsems, int semflg);

②功能:创建信号量数组

③参数

key:IPC对象名称
nsems:信号量的个数
semflg:IPC_CREAT     不存在创建
            IPC_EXCL       存在报错

④返回值

成功返回信号量数组的ID
失败返回-1

   ●semop

①原型:int semop(int semid, struct sembuf *sops, size_t nsops);

②功能:完成对一个信号量的操作

③参数

semid:信号量数组的ID
sops:对信号量进行操作的空间的首地址
nsops:对信号量进行操作的个数

④返回值

成功返回0
失败返回-1

   ●semctl

①原型:int semctl(int semid, int semnum, int cmd, ...);

②功能:利用cmd实现对信号量的操作

③参数

semid:信号量数组的ID
semnum:操作的信号量的下标
cmd:IPC_RMID 删除信号量
        SETVAL 设置信号量的值

④返回值

成功返回0
失败返回-1

http://www.lryc.cn/news/626054.html

相关文章:

  • Ubuntu 下面安装搜狗输入法debug记录
  • Ubuntu一键安装harbor脚本
  • WSL虚拟机(我的是ubuntu20.04)将系统文件转移到E盘
  • 机器学习之决策树:从原理到实战(附泰坦尼克号预测任务)
  • LINUX819 shell:for for,shift ,{} ,array[0] array[s] ,declare -x -a
  • 中科米堆CASAIM提供机加工件来料自动化测量尺寸方案
  • 中国互联网医院行业分析
  • Linux下Mysql命令,创建mysql,删除mysql
  • 基于多级缓存架构的Redis集群与Caffeine本地缓存实战经验分享
  • 原牛:一站式自媒体工具平台
  • 【LeetCode题解】LeetCode 153. 寻找旋转排序数组中的最小值
  • [优选算法专题二——找到字符串中所有字母异位词]
  • 工业4.0时代,耐达讯自动化Profibus转光纤如何重构HMI通信新标准?“
  • 链表基本运算详解:查找、插入、删除及特殊链表
  • 多线程—飞机大战排行榜功能(2.0版本)
  • 科技云报到:AI推理破局,金融服务如何“逆天改命”
  • 颠覆性进化:OpenAI正式发布GPT-5,AI大模型进入“超级智能”时代
  • bit-Agent正式接入GPT-5,九科信息智能体能力再升级!
  • 电子电气架构 ---SDV技术基础与传统E/E架构有何不同?
  • 免费OCR工具支持哪些文档格式转换
  • 中兴B862AV3.2M/B862AV3.1-M2 晨星mso9385_安卓9_原厂备份救砖包
  • 基于C语言基础对C++的进一步学习_知识补充、组合类、类中的静态成员与静态函数、类中的常对象和常成员函数、类中的this指针、类中的友元
  • 网络编程day3
  • 机器翻译60天修炼专栏介绍和目录
  • 大模型问题:幻觉分类+原因+各个训练阶段产生幻觉+幻觉的检测和评估基准
  • 【技术揭秘】AI Agent操作系统架构演进:从单体到分布式智能的跃迁
  • Incredibuild 新增 Unity 支持:击破构建时间过长的痛点
  • Pygame第11课——实现经典打方块小游戏
  • 数据结构:二叉树oj练习
  • Linux------《零基础到联网:CentOS 7 在 VMware Workstation 中的全流程安装与 NAT 网络配置实战》