进程间通信(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值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.mfbz.cn/a/379026.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《Git 简易速速上手小册》第5章:高级 Git 技巧(2024 最新版)

文章目录 5.1 交互式暂存5.1.1 基础知识讲解5.1.2 重点案例&#xff1a;为 Python 项目分阶段提交5.1.3 拓展案例 1&#xff1a;细粒度控制更改5.1.4 拓展案例 2&#xff1a;处理遗漏的更改 5.2 使用 Rebase 优化提交历史5.2.1 基础知识讲解5.2.2 重点案例&#xff1a;整理 Pyt…

【Java】eclipse连接MySQL数据库使用笔记(自用)

注意事项 相关教程&#xff1a;java连接MySQL数据库_哔哩哔哩_bilibilijava连接MySQL数据库, 视频播放量 104662、弹幕量 115、点赞数 1259、投硬币枚数 515、收藏人数 2012、转发人数 886, 视频作者 景苒酱, 作者简介 有时任由其飞翔&#xff0c;有时禁锢其翅膀。粉丝群1&…

Vue中v-if和v-show区别

Vue中v-if和v-show是两个常用的指令&#xff0c;用于控制元素的显示和隐藏。虽然它们都能达到相同的效果&#xff0c;但在实现机制和使用场景上有一些区别。本文将详细介绍v-if和v-show的区别&#xff0c;并且通过示例代码来演示它们的使用。 首先&#xff0c;让我们来看一下v…

深度学习图像分类相关概念简析+个人举例2(CNN相关原理概念与计算)

&#xff08;2&#xff09;卷积神经网络&#xff1a;英文全称Convolutional Neural Network,简称 CNN 是一种常用于图像分类的深度学习模型&#xff0c;其主要特点是包含了卷积层和池化层&#xff0c;能够提取图像的局部特征。输入层、卷积层、池化层、全连接层和输出层都是卷积…

不必为发“压岁钱”或“红包”烦恼

中国人的民俗——过年要发“压岁钱”&#xff0c;也称发“ 红包 ”&#xff0c;时间确定在除夕夜12点正。因为按照传统观念&#xff0c;除夕夜是阴阳交替重要时刻&#xff1b;发“压岁钱”&#xff0c;也代表着辟邪驱鬼、保佑平安。“岁”字的谐音“祟”&#xff0c;即灾祸&…

Win10系统启动盘制作

前面简单介绍了操作系统&#xff0c;但是怎样将操作系统安装到磁盘上呢。 一、操作系统引导 电脑启动大致流程&#xff1a; 预引导阶段&#xff1a;计算机通电后&#xff0c;系统自检&#xff0c;检查硬件是否正常。 引导阶段&#xff1a;BIOS或EFI在完成基本的硬件检测和平台初…

【GAMES101】Lecture 19 相机

目录 相机 视场 Field of View (FOV) 曝光&#xff08;Exposure&#xff09; 感光度&#xff08;ISO&#xff09; 光圈 快门 相机 成像可以通过我们之前学过的光栅化成像和光线追踪成像来渲染合成&#xff0c;也可以用相机拍摄成像 今天就来学习一下相机是如何成像的…

【模板初阶】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 1. 泛型编程 2. 函数模板 2.1 函数模板概念 2.2 函数模板格式 2.3 函数模板的原理 2.4 函数模板的实例化 2.5 模板参数的匹配原则 3. 类模板 3.1 类模板的定义…

夜天之书 #95 GreptimeDB 社群观察报告

GreptimeDB 是格睿科技&#xff08;Greptime&#xff09;公司研发的一款开源时序数据库&#xff0c;其源代码[1]在 GitHub 平台公开发布。 https://github.com/GreptimeTeam/greptimedb 我从 2022 年开始知道有 GreptimeDB 这个项目。2023 年&#xff0c;我注意到他们的 Commun…

Spring Boot + 七牛OSS: 简化云存储集成

引言 Spring Boot 是一个非常流行的、快速搭建应用的框架&#xff0c;它无需大量的配置即可运行起来&#xff0c;而七牛云OSS提供了稳定高效的云端对象存储服务。利用两者的优势&#xff0c;可以为应用提供强大的文件存储功能。 为什么选择七牛云OSS? 七牛云OSS提供了高速的…

【vscode】windows11在vscode终端控制台中打印console.log()出现中文乱码问题解决

1. 问题描述 在前端开发过程中使用vscode编写node.js&#xff0c;需要在控制台中打印一些中文信息&#xff0c;但是一直出现中文乱码问题&#xff0c;英文和数字都显示正常。在网上试了很多设置的办法&#xff0c;最终找到windos11设置中解决。 2. 原因 首先打开控制台&…

GEE入门篇|栅格数据集概述(四):其他卫星产品

目录 1.甲烷数据集 2.天气及气候数据 3.预先分类的土地用途和土地覆盖数据集 3.1ESA WorldCover 3.2 全球森林变化数据集 卫星还可以收集有关气候、天气和大气中存在的各种化合物的信息。这些卫星利用部分电磁频谱&#xff0c;以及不同物体和化合物在不同波长的阳光照射下…

Verilog刷题笔记22

题目&#xff1a; Build a priority encoder for 8-bit inputs. Given an 8-bit vector, the output should report the first (least significant) bit in the vector that is 1. Report zero if the input vector has no bits that are high. For example, the input 8’b100…

父母老了,耳朵听不清怎么办?

你有没有发现&#xff0c;随着年纪的增长&#xff0c;父母的耳朵好像越来越不好使了&#xff1a; 家里的电视声越放越大&#xff1b; 和他们说话常常讲到一半就被打岔&#xff1b; 一件事情要重复说好几遍才能听清&#xff1b; …… 也许父母没意识到问题的严重性&#xff0…

Habitat环境学习四:Habitat-sim基础用于导航——使用导航网格NavMesh

如何使用导航网格NavMesh 官方教程1、NavMesh基础定义1.1 使用NavMesh的原因1.2 什么是NavMesh 2、NavMesh的使用方法2.1 获取自上而下Top down view视角地图2.2 在NavMesh中进行查询以及随机产生可导航点2.3 查找最短路径2.4 场景加载NavMesh2.5 重新计算并生成NavMesh2.6 什么…

免费:阿里云学生服务器领取申请(2024新版教程)

2024年阿里云学生服务器免费领取&#xff0c;先完成学生认证即可免费领取一台云服务器ECS&#xff0c;配置为2核2G、1M带宽、40G系统盘&#xff0c;在云服务器ECS实例过期之前&#xff0c;完成实验与认证任务&#xff0c;还可以免费续费6个月&#xff0c;阿里云百科aliyunbaike…

Java tomcat 使用spring-task,实现定时任务功能

前言 今天接触到一个需求&#xff0c;需要添加一个定时任务功能&#xff0c;第一反应是启动类EnableScheduling、定时任务方法使用Scheduled实现&#xff0c;导入项目后才发现&#xff0c;这个项目是ssm整合框架的tomcat项目&#xff0c;没有启动类&#xff0c; 于是改变了思路…

UDP 用户数据报协议

目录 1 UDP 1.1 UDP 的主要特点 1.1.1 UDP 是面向报文的 1.1.2 UDP 通信和端口号的关系 1.2 UDP 的首部格式 1.2.1 UDP 基于端口的分用 1.3 UDP抓包 1 UDP UDP 只在 IP 的数据报服务之上增加了一些功能&#xff1a; 1.复用和分用 2.差错检测 1.1 UDP 的主要特点 1.无连…

基于JavaWeb开发的宠物医院平台[附源码]

基于JavaWeb开发的宠物医院平台[附源码] &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 &#x1f4dd…

【服务器数据恢复】服务器RAID模块硬件损坏的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 某品牌服务器中有一组由数块SAS硬盘组建的RAID5磁盘阵列&#xff0c;服务器操作系统是WINDOWS SERVER&#xff0c;服务器中存放企业数据&#xff0c;无数据库文件。 服务器出故障之前出现过几次意外断电的情况&#xff0c;服务器断电…