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

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

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

函数: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值ftokkey_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的值初始化为1semctl(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;控制的信号灯个数为1if(strcmp(buf,"exit") == 0)break;}//6、撤销映射shmdt(buf);//7、删除共享内存IPC对象shmctl(shmid,IPC_RMID,NULL);//8、删除信号灯集IPC对象semctl(semid,0,IPC_RMID,NULL);   //删除信号灯0semctl(semid,1,IPC_RMID,NULL);   //删除信号灯1return 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值ftokkey_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的值初始化为1semctl(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->Vstruct sembuf sem_1 = {1,-1,0};  //信号灯1->Pwhile(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);   //删除信号灯0semctl(semid,1,IPC_RMID,NULL);   //删除信号灯1return 0;
} 

结果

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

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

相关文章

基于JAVA的教学资源共享平台 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课程资源模块2.4 课程作业模块2.5 课程评价模块 三、系统设计3.1 用例设计3.2 类图设计3.3 数据库设计3.3.1 课程档案表3.3.2 课程资源表3.3.3 课程作业表3.3.4 课程评价表 四、系统展…

【原创 附源码】Flutter海外登录--Tiktok登录最详细流程

最近接触了几个海外登录的平台&#xff0c;踩了很多坑&#xff0c;也总结了很多东西&#xff0c;决定记录下来给路过的兄弟坐个参考&#xff0c;也留着以后留着回顾。更新时间为2024年2月7日&#xff0c;后续集成方式可能会有变动&#xff0c;所以目前的集成流程仅供参考&#…

ad18学习笔记十八:如何放置丝印层敷铜?

我画板的时候&#xff0c;需要把板卡顶面丝印层的一个矩形区域&#xff0c;画成白色&#xff0c;但是这个区域内有好几个焊盘&#xff0c;丝印涂色的地方需要避开这几个焊盘&#xff0c;我觉得不能简单的在丝印层画一个矩形完事&#xff0c;最好让丝印层的这个区域&#xff0c;…

自然语言学习nlp 六

https://www.bilibili.com/video/BV1UG411p7zv?p118 Delta Tuning&#xff0c;尤其是在自然语言处理&#xff08;NLP&#xff09;和机器学习领域中&#xff0c;通常指的是对预训练模型进行微调的一种策略。这种策略不是直接更新整个预训练模型的权重&#xff0c;而是仅针对模型…

精简还是全能?如何在 Full 和 Lite 之间做出最佳选择!关于Configuration注解的Full模式与Lite模式(SpringBoot2)

&#x1f3c3;‍♂️ 微信公众号: 朕在debugger© 版权: 本文由【朕在debugger】原创、需要转载请联系博主&#x1f4d5; 如果文章对您有所帮助&#xff0c;欢迎关注、点赞、转发和订阅专栏&#xff01; 前言 关于 Configuration 注解&#xff0c;相信在座的各位 Javaer 都…

[Python] 深入理解列表和元组

在学习的C语言中有数组可以用来存储数据&#xff0c;那么在Python中是否也有这样的工具呢&#xff1f;接下来让可莉来给大家讲解列表和元组这两个强力工具吧~ 专栏&#xff1a;《Python》 blog&#xff1a;Keven ’ s blog 在 Python 中&#xff0c;列表和元组是两种常用的序列…

Linux系统安装(CentOS Vmware)

学习环境安装 VMware安装 VMware下载&安装 访问官网&#xff1a;https://www.vmware.com 在此处可以选择语言 点击China&#xff08;简体中文&#xff09; 点击产品&#xff0c;点击Workstation Pro 下滑&#xff0c;点击下载试用版 下滑找到Workstation 17 Pro for Wi…

【RPA】浅谈RPA技术及其应用

摘要&#xff1a;随着信息技术的飞速发展&#xff0c;企业对于自动化、智能化的需求日益增强。RPA&#xff08;Robotic Process Automation&#xff0c;机器人流程自动化&#xff09;技术应运而生&#xff0c;为企业提供了全新的自动化解决方案。本文首先介绍了RPA技术的基本概…

Github 2024-02-09 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-02-09统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目4Go项目2Scala项目1PLpgSQL项目1Ruby项目1HTML项目1Solidity项目1Lua项目1 开源个人理财应用 Mayb…

8868体育助力法甲巴黎圣日耳曼俱乐部 运作球员转会

法甲的巴黎圣日耳曼足球俱乐部是8868的体育助力球队之一&#xff0c;根据法国媒体RMC的消息&#xff0c;巴黎圣日尔曼仍然希望在一月份增强球队的后防实力。虽然之前球队已经从圣保罗引进了20岁的巴西中后卫卢卡斯-贝拉尔多&#xff0c;而这名小将也将会是巴黎圣日耳曼冬窗的一…

ruoyi若依框架SpringSecurity实现分析

系列文章 ruoyi若依框架学习笔记-01 ruoyi若依框架分页实现分析 ruoyi若依框架SpringSecurity实现分析 文章目录 系列文章前言具体分析一、项目中的SpringSecurity版本二、登录认证流程分析三、权限鉴定四、退出登录五、SpringSecurity配置类 总结 前言 在ruoyi-vue若依框…

Java汽车销售管理

技术架构&#xff1a; springboot mybatis Mysql5.7 vue2 npm node 有需要该项目的小伙伴可以私信我你的Q。 功能描述&#xff1a; 针对汽车销售提供客户信息、车辆信息、订单信息、销售人员管理、财务报表等功能&#xff0c;提供经理和销售两种角色进行管理 效果图&…

Seurat - 聚类教程 (1)

设置 Seurat 对象 在本教程[1]中&#xff0c;我们将分析 10X Genomics 免费提供的外周血单核细胞 (PBMC) 数据集。在 Illumina NextSeq 500 上对 2,700 个单细胞进行了测序。可以在此处[2]找到原始数据。 我们首先读取数据。 Read10X() 函数从 10X 读取 cellranger 管道的输出&…

第十六篇【传奇开心果系列】Python的OpenCV库技术点案例示例:图像质量评估

传奇开心果短博文系列 系列短博文目录Python的OpenCV库技术点案例示例短博文系列博文目录前言一、图像质量评估方法和相关函数的介绍二、均方误差示例代码三、峰值信噪比示例代码四、结构相似性指数示例代码五、视频质量评估示例代码六、OpenCV均方根误差计算示例代码七、OpenC…

贵金属交易包括哪些?香港有哪些贵金属交易平台?

随着金融市场的不断发展&#xff0c;贵金属交易作为一种投资方式&#xff0c;越来越受到投资者的关注。贵金属交易不仅具有投资价值&#xff0c;还能够为投资者提供规避风险和保值的工具。本文将介绍贵金属交易的种类和香港的贵金属交易平台。 一、贵金属交易的种类 贵金属交…

运维的利器--监控--zabbix--第一步:建设zabbix

文章目录 准备工作安装要求安装包获取安装环境 安装工作一、zabbix server服务端安装1.安装mysql2.安装zabbix server及配置环境3.设置并访问zabbix页面5.配置自我监控二、被监控端zabbix agent安装三、在服务端中添加被监控端 思维导图 准备工作 安装要求 为啥要确保正常上网…

【Java】苍穹外卖 Day01

苍穹外卖-day01 课程内容 软件开发整体介绍苍穹外卖项目介绍开发环境搭建导入接口文档Swagger 项目整体效果展示&#xff1a; 管理端-外卖商家使用用户端-点餐用户使用当我们完成该项目的学习&#xff0c;可以培养以下能力&#xff1a; 1. 软件开发整体介绍 作为一名软件开…

【C语言】SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)

一、SYSCALL_DEFINE3与系统调用 在Linux操作系统中&#xff0c;为了从用户空间跳转到内核空间执行特定的内核级操作&#xff0c;使用了一种机制叫做"系统调用"&#xff08;System Call&#xff09;。系统调用是操作系统提供给程序员访问和使用内核功能的接口。例如&…

Android开发-之屏幕适配

Android开发-之屏幕适配 前言 Android 系统能发展到今天&#xff0c;离不开其开源性&#xff0c;但是随着越来越多的设备接入 Android 系统&#xff0c;并对 Android 系统进行各种各样的定制&#xff0c;导致长期以来出现了各种碎片化严重的问题。例如&#xff0c;Android 屏…

【新书推荐】7.2 while语句

本节必须掌握的知识点&#xff1a; 掌握if语句语法 熟练使用if语句 7.2.1 示例二十三 ■while语句其语法形式&#xff1a; while(表达式) { 语句块&#xff1b; } ●语法解析&#xff1a; 第一步&#xff1a;执行表达式&#xff0c;如果表达式为真&#xff0c;则执行第…