进程间通信(5):信号灯集

news2024/9/23 11:23:27

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

信号灯集为信号量的集合,实现同步、互斥机制,配合共享内存使用,解决资源竞争问题。

函数:semget、semctl、semop

实现流程:

1、创建信号灯集的IPC对象 semget

2、信号灯集初始化 semctl

3、创建共享内存IPC对象 shmget

4、内存映射 shmat

5、PV操作 semop

6、撤销映射 shmdt

7、删除共享内存IPC对象 shmctl

8、删除信号灯集IPC对象 semctl

write.c

/*===============================================
*   文件名称:write.c
*   创 建 者:cxy    
*   创建日期:2024年02月08日
*   描    述:
================================================*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <string.h>
/*
struct sembuf{  //保存信号灯信息的结构体
    unsigned short sem_num;   //控制的信号灯编号
    short sem_op;       //-1为P操作,1为V操作
    short sem_flg;      //0为默认操作方式
};
*/
int main(int argc, char *argv[])
{
    //1、创建信号灯集IPC对象semget
    //1.1、获取key值ftok
    key_t key = ftok("/home",44);  //非0数
    //1.2、创建信号灯集IPC对象
    //获取信号灯集id号
    int semid = semget(key,2,IPC_CREAT|0664);   //信号灯集中信号灯的个数为2
    //2、信号灯集初始化
    semctl(semid,0,SETVAL,1);  //将信号灯0的值初始化为1
    semctl(semid,1,SETVAL,0);  //将信号灯1的值初始化为0
    //3、创建共享内存IPC对象
    key_t shmkey = ftok("/home",45);
    int shmid = shmget(shmkey,1024,IPC_CREAT|0664);  //共享内存带小为1024字节
    //4、内存映射
    char *buf = shmat(shmid,NULL,0);  //NULL为地址由操作系统分配,0为可读可写
    //5、PV操作
    struct sembuf sem_0 = {0,-1,0};  //信号灯0做P操作(P-V+)
    struct sembuf sem_1 = {1,1,0};  //信号灯1做V操作(P-V+)
    while(1)
    {
        semop(semid,&sem_0,1);   //值:1->0;控制的信号灯个数为1 
        scanf("%s",buf);
        semop(semid,&sem_1,1);   //值:0->1;控制的信号灯个数为1
        if(strcmp(buf,"exit") == 0)
            break;
    }
    //6、撤销映射
    shmdt(buf);
    //7、删除共享内存IPC对象
    shmctl(shmid,IPC_RMID,NULL);
    //8、删除信号灯集IPC对象
    semctl(semid,0,IPC_RMID,NULL);   //删除信号灯0
    semctl(semid,1,IPC_RMID,NULL);   //删除信号灯1

    return 0;
} 

read.c

/*===============================================
*   文件名称:read.c
*   创 建 者:cxy     
*   创建日期:2024年02月08日
*   描    述:
================================================*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <string.h>
/*
struct sembuf{  //保存信号灯信息的结构体
    unsigned short sem_num;   //控制的信号灯编号
    short sem_op;       //-1为P操作,1为V操作
    short sem_flg;      //0为默认操作方式
};
*/
int main(int argc, char *argv[])
{
    //1、创建信号灯集IPC对象semget
    //1.1、获取key值ftok
    key_t key = ftok("/home",44);  //非0数
    //1.2、创建信号灯集IPC对象
    //获取信号灯集id号
    int semid = semget(key,2,IPC_CREAT|0664);   //信号灯集中信号灯的个数为2
    //2、信号灯集初始化
    semctl(semid,0,SETVAL,1);  //将信号灯0的值初始化为1
    semctl(semid,1,SETVAL,0);  //将信号灯1的值初始化为0
    //3、创建共享内存IPC对象
    key_t shmkey = ftok("/home",45);
    int shmid = shmget(shmkey,1024,IPC_CREAT|0664);  //共享内存带小为1024字节
    //4、内存映射
    char *buf = shmat(shmid,NULL,0);  //NULL为地址由操作系统分配,0为可读可写
    //5、PV操作
    struct sembuf sem_0 = {0,1,0};  //信号灯0->V
    struct sembuf sem_1 = {1,-1,0};  //信号灯1->P
    while(1)
    {
        semop(semid,&sem_1,1);   //由于sem_1为0,所以阻塞等待,写端完成一次while后,信号灯1已由0->1再P-,信号灯0已由1->0再V+
        printf("%s\n",buf);
        semop(semid,&sem_0,1);   
        if(strcmp(buf,"exit") == 0)
            break;
    }
    //6、撤销映射
    shmdt(buf);
    //7、删除共享内存IPC对象
    shmctl(shmid,IPC_RMID,NULL);
    //8、删除信号灯集IPC对象
    semctl(semid,0,IPC_RMID,NULL);   //删除信号灯0
    semctl(semid,1,IPC_RMID,NULL);   //删除信号灯1

    return 0;
} 

结果

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

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

相关文章

滑动窗口(二)

文章目录 Leetcode1658. 将 x 减到 0 的最小操作数题目解法&#xff08;滑动窗口&#xff09; Leetcode904. 水果成篮题目解法&#xff08;滑动窗口&#xff09; Leetcode438. 找到字符串中所有字母异位词题目解法&#xff08;滑动窗口&#xff09; Leetcode1658. 将 x 减到 0 …

如何从iPhone15上恢复意外删除的数据文件(备忘录、通讯录、照片等)

您是否正在寻找恢复 Apple 设备上丢失数据的方法&#xff1f;这是最好用的 iPhone 15数据恢复软件的汇总。 iPhone 数据恢复软件允许从Apple 设备中检索丢失或删除的数据。随着越来越依赖智能手机来存储个人和专业信息&#xff0c;数据丢失可能是一种令人沮丧和压力很大的体验…

licheepi nano 从零开始使用sd卡启动

本文目的&#xff1a;licheepi nano从零开始&#xff0c;使用sd卡启动&#xff1b; 某些原因导致需要重新捣鼓uboot&#xff0c;但过程中频繁出错&#xff0c;后悔最初没有记录详细的操作方法&#xff0c;此帖主要为自己出口气&#xff0c;重新记录&#xff1b; 持续完善&#…

CentOS 安装 redis 7.2

nginx官网 https://redis.io/download/ 把鼠标放到这里&#xff0c;复制下载地址 在服务器找个文件夹执行命令 wget https://github.com/redis/redis/archive/7.2.4.tar.gz tar -zxvf 7.2.4.tar.gz make make install 看到这几行就说明安装成功了 不放心的话再查看下b…

Java基础常见面试题总结-并发(一)

线程池 线程池&#xff1a;一个管理线程的池子。 为什么平时都是使用线程池创建线程&#xff0c;直接new一个线程不好吗&#xff1f; 嗯&#xff0c;手动创建线程有两个缺点 不受控风险频繁创建开销大 为什么不受控&#xff1f; 系统资源有限&#xff0c;每个人针对不同业…

【C++】引用与内联

个人主页 &#xff1a; zxctsclrjjjcph 文章封面来自&#xff1a;艺术家–贤海林 如有转载请先通知 文章目录 1. 前言2. 引用2.1 引用概念2.2 引用使用场景2.3 引用特性2.4 引用和指针的区别2.5 传值、传引用效率比较2.5.1 值和引用的作为返回值类型的性能比较 3. 内联函数3.1 …

React + SpringBoot + Minio实现文件的预览

思路&#xff1a;后端提供接口&#xff0c;从minio获取文件的预览链接&#xff0c;返回给前端&#xff0c;前端使用组件进行渲染展示 这里我从minio获取文件预览地址用到了一个最近刚开源的项目&#xff0c;挺好用的&#xff0c;大伙可以试试&#xff0c;用法也很简单 官网&am…

【Unity】QFramework通用背包系统优化:TipPanel优化

前言 在学习凉鞋老师的课程《QFramework系统设计&#xff1a;通用背包系统》第五章时&#xff0c;笔者对物品提示TipPanel界面进行了一些优化。 优化内容包括&#xff1a; 解决闪烁问题跟随鼠标移动自适应界面大小生成位置优化 效果还是蛮丝滑的&#xff1a; 解决闪烁问题 …

Unknown system variable ‘tx_read_only

使用datagrip可以创建成功 但是使用pycharm就会报一个错误“Unknown system variable tx_read_only”

springboot164党员教育和管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

作业2.8

1、选择题 1.1、以下选项中,不能作为合法常量的是 ____B______ A&#xff09;1.234e04 B&#xff09;1.234e0.4 C&#xff09;1.234e4 D&#xff09;1.234e0 1.2、以下定义变量并初始化错误的是_____D________。 A) char c1 ‘H’ &#xff1b; B) char c…

第3章 模板

学习目标 了解模板与模板引擎Jinja2&#xff0c;能够复述模板引擎和模板的作用 掌握模板变量的语法&#xff0c;能够在Jinja2模板中定义模板变量 掌握过滤器的使用&#xff0c;能够在Jinja2模板中使用过滤器过滤模板变量保存的数据 掌握选择结构的使用&#xff0c;能够在Jin…

Redis篇之过期淘汰策略

一、数据的过期策略 1.什么是过期策略 Redis对数据设置数据的有效时间&#xff0c;数据过期以后&#xff0c;就需要将数据从内存中删除掉。可以按照不同的规则进行删除&#xff0c;这种删除规则就被称之为数据的删除策略&#xff08;数据过期策略&#xff09;。 2.过期策略-惰…

1.3 Verilog 环境搭建详解教程

学习 Verilog 做仿真时&#xff0c;可选择不同仿真环境。FPGA 开发环境有 Xilinx 公司的 ISE&#xff08;目前已停止更新&#xff09;&#xff0c;VIVADO&#xff1b;因特尔公司的 Quartus II&#xff1b;ASIC 开发环境有 Synopsys 公司的 VCS &#xff1b;很多人也在用 Icarus…

python-自动化篇-办公-一键将word中的表格提取到excel文件中

文章目录 代码 工作中&#xff0c;经常需要将Word文档中的表格粘贴到Excel文件中&#xff0c;以便汇总及分析。一个一个复制粘贴&#xff0c;非常不方便&#xff0c;还是Python自动化操作&#xff0c;省心省力。要求如下图所示&#xff0c;即将word中的所有表格&#xff0c;转存…

Transformer实战-系列教程13:DETR 算法解读

&#x1f6a9;&#x1f6a9;&#x1f6a9;Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 点我下载源码 1、物体检测 说到目标检测你能想到什么 faster-rcnn系列&#xff0c;开山之作&…

【开源】SpringBoot框架开发大病保险管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统配置维护2.2 系统参保管理2.3 大病保险管理2.4 大病登记管理2.5 保险审核管理 三、系统详细设计3.1 系统整体配置功能设计3.2 大病人员模块设计3.3 大病保险模块设计3.4 大病登记模块设计3.5 保险审核模块设计 四、…

vscode无法ssh远程连接到服务器:远程主机可能不符合 glibc 和 libstdc++ VS Code 服务器的先决条件

vscode无法ssh远程连接到服务器&#xff1a;远程主机可能不符合 glibc 和 libstdc VS Code 服务器的先决条件 今天vscode自动更新后无法连接到远程服务器了&#xff0c;提示"远程主机可能不符合 glibc 和 libstdc VS Code 服务器的先决条件" 并且命令窗口一直显示&qu…

DFS——迭代加深、双向DFS、IDA*

迭代加深 迭代加深主要用于dfs搜索过程中&#xff0c;某条支路特别深&#xff0c;但是答案在特别浅的地方&#xff0c;也即在另一个分支中&#xff0c;但是按照dfs的原理&#xff0c;我们是将这条支路搜完才去搜另一条支路。所以我们就要及时剪枝&#xff0c;而迭代加深算法则…

ZigBee学习——在官方例程上实现串口通信

Z-Stack版本为3.0.2 IAR版本为10.10.1 文章目录 一、添加头文件二、定义接收缓冲区三、编写Uart初始化函数四、编写串口回调函数五、函数声明六、函数调用七、可能遇到的问题(function “halUartInit“ has no prototype) 以下所有操作都是在APP层进行&#xff0c;也就是这个文…