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

IO进程(8)

目录

1.信号灯集

1.1概念

1.2操作步骤

1.3函数接口

1.3.1创建信号灯集

1.3.2初始化或删除信号灯集

​​​​​​​​​​​​​​1.3.3pv操作

​​​​​​​​​​​​​​1.4操作命令

2.消息队列

2.1特点

​​​​​​​​​​​​​​2.2步骤

​​​​​​​2.3函数接口

2.3.1创建消息队列

​​​​​​​​​​​​​​2.3.2添加消息

​​​​​​​2.3.3读取消息

​​​​​​​​​​​​​​2.3.4删除消息队列

​​​​​​​​​​​​​​2.4操作命令


1.信号灯集

1.1概念

信号灯(semaphore),也叫信号量。它是不同进程间或一个给定进程内部不同线程间同步的机制;

System V信号灯集是一个或者多个信号灯的一个集合。其中的每一个都是单独的计数信号灯。而Posix信号灯指的是单个计数信号灯。

通过信号灯集实现共享内存的同步操作

1.2操作步骤

  1. 创建key值
  2. 创建或打开信号灯集 semget
  3. 初始化信号灯集 semctl
  4. pv操作 semop
  5. 删除信号灯集 semctl

1.3函数接口

1.3.1创建信号灯集

#include <sys/sem.h>
int semget(key_t key, int nsems, int semflg);
功能:创建/打开信号灯
参数:key:ftok产生的key值
    nsems:信号灯集中包含的信号灯数目
    semflg:信号灯集的访问权限,通常为IPC_CREAT |0666
返回值:成功:信号灯集ID
       失败:-1

示例:

出现这种情况就是semid等于0了

我们可以手动去删除这个信号灯集:

ipcs -s :查看创建的信号灯集

ipcrm -s [semid]:删除信号灯集

​​​​​​​1.3.2初始化或删除信号灯集

int semctl ( int semid, int semnum,int cmd,…/*union semun arg*/);
功能:信号灯集合的控制(初始化/删除)
参数:semid:信号灯集ID
    semnum: 要操作的集合中的信号灯编号
     cmd:
        GETVAL:获取信号灯的值,返回值是获得值
        SETVAL:设置信号灯的值,
        IPC_RMID:从系统中删除信号灯集合
    ...:当cmd为SETVAL时,需要传递共用体
返回值:成功 0
      失败 -1
共用体格式:
    union semun {
       int              val;    /* 信号量的初值 */
       struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
       unsigned short  *array;  /* Array for GETALL, SETALL */
       struct seminfo  *__buf;  /* Buffer for IPC_INFO
                                           (Linux-specific) */
    };

示例:

补充:

1.当cmd为SETVAL时需要传递第四个参数,类型为共用体

用法:

union semun {int val;
};
union semun sem;
sem.val = 10;
semctl(semid, 0, SETVAL, sem); //对编号为0的信号灯设置初值为10

2.当cmd为IPC_RMID时,表示删除信号灯集

用法:semctl(semid, 0, IPC_RMID) // 0:表示信号灯的编号,指定任意一个即可删除

3.当cmd为GETVAL时,表示获取信号灯的值

用法:printf("%d\n", semctl(semid, 0, GETVAL));

​​​​​​​​​​​​​​1.3.3pv操作

int semop ( int semid, struct sembuf  *opsptr,  size_t  nops);
功能:对信号灯集合中的信号量进行PV操作
参数:semid:信号灯集ID
     opsptr:操作方式
     nops:  要操作的信号灯的个数 1个
返回值:成功 :0
      失败:-1
struct sembuf {
   short  sem_num; // 要操作的信号灯的编号
   short  sem_op;  //    0 :  等待,直到信号灯的值变成0
                   //   1  :  释放资源,V操作
                   //   -1 :  分配资源,P操作                    
    short  sem_flg; // 0(阻塞),IPC_NOWAIT, SEM_UNDO
};

使用:

申请资源 P操作:

mysembuf.sem_num = 0;

mysembuf.sem_op = -1;

mysembuf.sem_flg = 0;

semop(semid, &mysembuf, 1);

释放资源 V操作:

mysembuf.sem_num = 0;

mysembuf.sem_op = 1;

mysembuf.sem_flg = 0;

semop(semid, &mysembuf, 1);

示例:

优化:将初始化和pv操作封装成函数

进一步优化方案:封装成库

union semun
{
    int val;
};// 初始化
void seminit(int semid, int num, int val)
{
    union semun sem;
    sem.val = val;
    semctl(semid, num, SETVAL, sem);
}// pv操作
void sem_op(int semid, int num, int op)
{
    struct sembuf buf;
    buf.sem_num = num;
    buf.sem_op = op;
    buf.sem_flg = 0;    semop(semid, &buf, 1);
}

​​​​​​​​​​​​​​1.4操作命令

ipcs -s :查看创建的信号灯集

ipcrm -s [semid]:删除信号灯集

2.消息队列

2.1特点

  1. 消息队列就是一个消息的列表。用户可以在消息队列中添加消息、读取消息等。
  2. 消息队列可以按照类型来发送/接收消息
  3. 在linux下消息队列的大小有限制。
  • 消息队列个数最多为16个;
  • 消息队列总容量最多为16384字节;
  • 每个消息内容最多为8192字节。

​​​​​​​

​​​​​​​​​​​​​​2.2步骤

  1. 创建key值
  2. 创建或打开消息队列 msgget
  3. 添加消息 msgsnd
  4. 读取消息 msgrcv
  5. 删除消息队列 msgctl

​​​​​​​2.3函数接口

2.3.1创建消息队列

#include <sys/msg.h>
int msgget(key_t key, int flag);
功能:创建或打开一个消息队列
参数:  key值
       flag:创建消息队列的权限IPC_CREAT|IPC_EXCL|0666
返回值:成功:msgid
       失败:-1

示例:

​​​​​​​​​​​​​​2.3.2添加消息

int msgsnd(int msqid, const void *msgp, size_t size, int flag); 
功能:添加消息
参数:msqid:消息队列的ID
      msgp:指向消息的指针。常用消息结构msgbuf如下:
          struct msgbuf{
            long mtype;        //消息类型
            char mtext[N]};   //消息正文
          }
   size:发送的消息正文的字节数
   flag:IPC_NOWAIT消息没有发送完成函数也会立即返回    
         0:直到发送完成函数才返回
返回值:成功:0
      失败:-1

示例:

​​​​​​​2.3.3读取消息

int msgrcv(int msgid,  void* msgp,  size_t  size,  long msgtype,  int  flag);
功能:读取消息
参数:msgid:消息队列的ID
     msgp:存放读取消息的空间
     size:接受的消息正文的字节数
    msgtype:0:接收消息队列中第一个消息。
            大于0:接收消息队列中第一个类型为msgtyp的消息.
            小于0:接收消息队列中类型值不小于msgtyp的绝对值且类型值又最小的消息。
     flag:0:若无消息函数会一直阻塞
        IPC_NOWAIT:若没有消息,进程会立即返回ENOMSG
返回值:成功:接收到的消息的长度
      失败:-1

示例:

​​​​​​​​​​​​​​2.3.4删除消息队列

int msgctl ( int msgqid, int cmd, struct msqid_ds *buf );
功能:对消息队列的操作,删除消息队列
参数:msqid:消息队列的队列ID
     cmd:
        IPC_STAT:读取消息队列的属性,并将其保存在buf指向的缓冲区中。
        IPC_SET:设置消息队列的属性。这个值取自buf参数。
        IPC_RMID:从系统中删除消息队列。
     buf:消息队列缓冲区
返回值:成功:0
      失败:-1

示例:

​​​​​​​​​​​​​​2.4操作命令

ipcs -q:查看消息队列

ipcrm -q msgid:删除消息队列

cat伪代码

int main()
{// 打开文件
    FILE *fp = fopen(file, "r");if(fp == NULL){
        error;}while(ch = fgetc(fp) != NULL)printf(ch);fclose(fp);return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • pymysql 与 MySQL数据库交互
  • 开发团队如何应对突发的技术故障和危机?从网易云音乐故障谈起
  • 小程序路由传参和获取页面栈方法
  • 45.5【C语言】typedef
  • 设计模式(三)
  • ctfshow之web29~web51
  • 编译运行 llama.cpp (vulkan, Intel GPU SYCL)
  • 【数学分析笔记】第2章第4节收敛准则(1)
  • ES之二:centos7安装kibana和IK分词器
  • React的生命周期方法以及React 18之后的变化
  • 时序预测|基于贝叶斯BO-卷积-双向门控单元-注意力机制的单变量时间序列预测模型BO-CNN-BiGRU-Attention
  • SMF05C.TCT TVS二极管阵列用于ESD和锁定保护芯片IC
  • github源码指引:C++嵌入式WEB服务器
  • JAVA面试题--ES
  • 切面条(蓝桥杯-基础)
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • HTML-表单
  • HTTP那些事
  • js面向对象
  • node和express搭建代理服务器(源码)
  • Object.assign方法不能实现深复制
  • php面试题 汇集2
  • rabbitmq延迟消息示例
  • React+TypeScript入门
  • SpiderData 2019年2月23日 DApp数据排行榜
  • Webpack入门之遇到的那些坑,系列示例Demo
  • win10下安装mysql5.7
  • 给第三方使用接口的 URL 签名实现
  • 记一次和乔布斯合作最难忘的经历
  • 技术胖1-4季视频复习— (看视频笔记)
  • 扑朔迷离的属性和特性【彻底弄清】
  • 使用SAX解析XML
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • #if 1...#endif
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (WSI分类)WSI分类文献小综述 2024
  • (创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据
  • (二)WCF的Binding模型
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .Net 4.0并行库实用性演练
  • .NET delegate 委托 、 Event 事件
  • .NET8使用VS2022打包Docker镜像
  • .NET构架之我见
  • .net开发时的诡异问题,button的onclick事件无效
  • @Autowired 和 @Resource 区别的补充说明与示例
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [<事务专题>]