IO进程(8)

news2024/11/22 7:01:23

目录

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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2069693.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何选择适合自己的开放式耳机?五款实力出众爆款安利!

开放式耳机以其不侵入耳道的设计&#xff0c;为耳朵提供了更轻的负担&#xff0c;同时保护了耳道健康&#xff0c;这与传统的头戴式或入耳式耳机相比&#xff0c;在长时间佩戴时更能减少不适感。市场上的开放式耳机种类繁多&#xff0c;要找到一款真正满意的产品可能有些困难。…

使用kubeadm快速部署一套K8S集群

一、Kubernetes概述 1.1 Kubernetes是什么 Kubernetes是Google在2014年开源的一个容器集群管理系统&#xff0c;Kubernetes简称K8S。 K8S用于容器化应用程序的部署&#xff0c;扩展和管理。 K8S提供了容器编排&#xff0c;资源调度&#xff0c;弹性伸缩&#xff0c;部署管理…

Meta被曝取消了自己的“Vision Pro计划”内部代号La Jolla

据媒体周五报道&#xff0c;美国科技巨头Meta已经取消了原定于2027年推出高端混合现实头显的计划&#xff0c;Meta原本计划利用这款设备与苹果的Vision Pro一较高下。据Meta的两名员工声称&#xff0c;在本周的一次产品审查会议后&#xff0c;公司管理层突然要求Reality Labs部…

【数据结构】动态顺序表的实现

1.什么是数据结构 数据结构就是把数据元素按照一定的关系组织起来的集合&#xff0c;用来组织和存储数据。通过数据结构&#xff0c;能够有效的将数据组织和管理在一起&#xff0c;按照我们的方式任意对数据进行增删查改等操作。 2.数据结构的分类 数据结构大概可分为逻辑结构…

拆分因子+减枝

前言&#xff1a;一开始看到数据量这么大&#xff0c;我怎么拆分出因子&#xff0c;看了题解才发现要大减枝&#xff0c;但是如何拆分因数我还是要好好学一下 1 0 18 10^{18} 1018 的拆分因子有 1 0 5 10^5 105 的复杂度&#xff0c;再乘以 1 0 3 10^3 103 的数量&#xff0c…

光伏电站设备设施巡视卡之转变二维码登记卡

光伏电站作为重要的能源供应设施&#xff0c;其稳定运行和高效维护至关重要&#xff0c;光伏电站巡回检查制度是保障电站设备正常运行和安全性的重要手段,制定好的制度可以提高电站的经济效益和安全性。 传统的纸质光伏电站巡视卡容易出现巡检记录作假、信息统计不及时、汇总困…

分享一个基于python的零食销售数据采集与可视化分析系统django爬虫项目大数据源码(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

国产实时操作系统:和RT-Linux,Zephyr的实时性对比

RT-Thread 在工业领域、高安全高可靠性领域&#xff0c;实时操作系统在其中发挥着重要的作用&#xff0c;从毫秒级&#xff0c;微秒级实时响应&#xff0c;决定着装置系统能满足何种严苛的要求。 RT-Thread Smart操作系统是一套基于RT-Thread内核&#xff0c;并具备POSIX用户态…

LeetCode84(柱状图中最大的矩形)理解单调栈

1. LeetCode84(柱状图中最大的矩形) 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights [2,1,5,6,2,3] 输出&#xff…

大模型时代,什么样的算法工程师更吃香?

毫无疑问&#xff0c;全栈型的算法工程师将更为抢手&#xff0c;如果你精通大模型从训练到应用的整个流程&#xff0c;你走到哪里都不怕。 但往往人的精力有限&#xff0c;如果从数据、预训练、微调、对齐、推理、应用几个方面来看的话&#xff0c;个人觉得现在重要性排序是“…

python测试框架之Pytest

初识Pytest Pytest1.Pytest的特点&#xff1a;2.Pytest的基本使用规则3.pytest安装1&#xff09;使用编译器安装2&#xff09;使用命令安装 4.pytest规则 Pytest Pytest是python的一个第三方单元测试库&#xff0c;它的目的是让单元测试变得容易&#xff0c;并且也能扩展到支持…

同一个wifi不同电脑ip一样吗?网络ip地址怎么修改

‌在数字化时代&#xff0c;Wi-Fi已成为我们日常生活与工作中不可或缺的一部分&#xff0c;它让多台设备能够轻松接入互联网&#xff0c;实现信息共享与数据传输。然而&#xff0c;你是否曾好奇过&#xff0c;在同一个Wi-Fi网络下&#xff0c;不同电脑的IP地址是否会不一样&…

10个Python自动化日常任务实战脚本示例

小编准备入门了Python入门学习籽料80个Python入门实例 点击 领取&#xff08;无偿获得&#xff09; 1. 自动备份文件夹 目标 : 每天自动将指定文件夹的内容备份到另一个位置。 import shutil import datetime def backup_files(source, destination): """…

DevEcoStudio创建的默认工程HelloWorld build失败请问如何解决?

解决方法&#xff1a; 方法一&#xff1a; 方法二&#xff1a; 确认当前登录的windows用户是否是Administrator&#xff0c;出现这种情况&#xff0c;大概率都是普通用户&#xff0c;所以造成权限不足的问题。一种解决办法是切换到Administrator用户再打开项目进行build。 如…

已拿证 | 2024深圳驾考科目四全攻略:技巧、知识点一网打尽

目录 _head 精简500题 区分变道和左转&#xff0c;变道手下垂&#xff0c;左转手伸直 紧急包扎需要柔软介质 网状线内禁止停车 会车千万不能开远光灯 只准直行 城3公4 城5公7 一急二反三连续 落水救援 驾驶陋习 车到路肩人在外 交警先看脸&#xff01;&#xff01…

Redis保姆级安装教程

下载:https://github.com/redis-windows/redis-windows/releases 然后就慢慢等待 下载完解压,打开 以管理员身份运行,这里一直按回车就可以了 复制路径 这里勾错了,是编辑 修改配置文件redis.conf 加这一行 以管理员身份运行cmd,输入redis-cli 在输入ping 再输入info 这样就完…

IP-RDS-222、IP-PRZ-59-AM12、EG-TRZ-42-L、EG-TRZ-42-H比例减压阀放大器

IP-DAR-250、IP-DAR-43C-L、IP-DAR-43C-H、IP-RDS-222、IP-PRZ-59-AM12、EG-TRZ-42-L、EG-TRZ-42-H比例减压阀 EE-PRB、EE-PRD比例压力阀 EE-P2G、ET-P2S、EB-P2A、EE-P2A、ET-P2A、EE-P2H、EG-F2A、EU-F2A比例流量阀 EF-F3G、EU-F3G比例压力补偿流量阀 EQ-S4M、EG-S4M、EQ…

【JAVA CORE_API】Day21 Map接口、在线聊天室v3.0、Java的反射机制(P1)

Map接口 Map接口 Map是Java中用于存储键值对&#xff08;key-value pairs&#xff09;的接口&#xff0c;每个键&#xff08;key&#xff09;对应一个值&#xff08;value&#xff09;。它不允许重复的键&#xff0c;但允许不同的键映射相同的值。 关键特点&#xff1a; 键值…

Linux 可视化管理工具:宝塔面板(BT)

&#x1f600;前言 在 Linux 系统的运维管理中&#xff0c;命令行界面&#xff08;CLI&#xff09;是主要的操作方式。然而&#xff0c;对于许多系统管理员或开发者来说&#xff0c;使用 CLI 进行管理和维护任务并不总是最直观或最方便的方式。为了简化操作并提高效率&#xff…

【注解】反序列化时匹配多个 JSON 属性名 @JsonAlias 详解

JsonAlias 注解是 Jackson 提供的一个功能强大的注解&#xff0c;允许一个字段在反序列化时匹配多个 JSON 属性名。它适用于在处理多种输入数据格式时&#xff0c;或当 JSON 数据的键名可能变化时。 一、JsonAlias 的作用 多种别名&#xff1a;JsonAlias 允许你为一个字段定义…