io+day8

news2024/10/6 12:28:08

 

 #ifndef __SEM
  2 #define __SEM
  3 
  4 //声明一个创>
  5 int init_sem(
  6 
  7 //声明一个p操
  8 int P(int sem
  9 
 10 //声明一个v操
 11 int W(int sem
 12 
 13 //声明一个删>
 14 int del_sem(i
 15 
 16 #endif
1 #include <myhead.h>                                                                                                                           
  2 union semun {
  3     int              val;    /* Value for SETVAL */
  4     struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
  5     unsigned short  *array;  /* Array for GETALL, SETALL */
  6     struct seminfo  *__buf;  /* Buffer for IPC_INFO
  7                     (Linux-specific) */
  8 };
  9 //信号灯集里每个信号灯的初始化
 10 int sem_value(int semid,int semno,int semvalue)
 11 {
 12     union semun us;
 13     us.val=semvalue;
 14     if(semctl(semid,semno,SETVAL,us)==-1)
 15     {
 16         perror("semctr");
 17         return -1;
 18     }
 19     return 0;
 20 }
 21 //创建信号灯集并初始化函数
 22 int init_sem(int semnum)
 23 {
 24     //1.创建一个key钥匙
 25     key_t key;
 26     if((key=ftok("/",'t'))==-1)
 27     {
 28         perror("ftok");
 29         return -1;
 30     }
 31     //2.创建一个信号灯集
 32     int semid;
 33     if((semid=semget(key,semnum,IPC_CREAT|IPC_EXCL|0664))==-1)
 34     {
 35         if(errno==EEXIST)
 36         {
 37             //防止多进程同时调用时多次初始化
 38             semid=semget(key,semnum,IPC_CREAT|0664);
 39             return semid;
 40         }
 41         perror("semget");
 42         return -1;
 43     }
 44     //3.信号灯集初始化
 45     for(int i=0;i<semnum;i++)
 46     {
 47         if(i==0)
 48         {
 49             //参数1:id
 50             //参数2:初始化的信号灯编号
 51             //参数3:初始化的信号灯的value值
 52             sem_value(semid,i,1);
 53         }
 54         else
 55         {
 56             sem_value(semid,i,0);
 57         }
 58     }
 59     return semid;
 60 }
 61 
 62 //p操作函数
 63 int P(int semid,int semno)
 64 {
 65     struct sembuf buf;
 66     buf.sem_num=semno;//灯集里灯编号
 67     buf.sem_op=1;  //释放资源
 68     buf.sem_flg=0; //阻塞
 69     if(semop(semid,&buf,1)==-1)
 70     {
 71         perror("semop");
 72         return -1;
 73     }
 74     return 0;
 75 
 76 }
 77 //w操作函数
 78 int W(int semid,int semno)
 79 {
 80         struct sembuf buf;
 81         buf.sem_num=semno;//灯集里灯编号
 82         buf.sem_op=-1;  //申请资源
 83         buf.sem_flg=0; //阻塞
 84         if(semop(semid,&buf,1)==-1)
 85         {
 86                 perror("semop");
 87                 return -1;
 88         }
 89         return 0;
 90 }
 91 
 92 //删除信号灯的函数
 93 int del_sem(int semid)
 94 {
 95     if(semctl(semid,0,IPC_RMID,0)==-1)
 96     {
 97         perror("semctl");
 98         return -1;
 99     }
100     return 0;
101 }
1 #include <myhead.h>
  2 #include "sem.h"
  3 int main(int argc, const char *argv[])
  4 {
  5     //创建钥匙
  6     key_t key=-1;
  7     if((key=ftok("/",'c'))==-1)
  8     {
  9         perror("ftok");
 10         return -1;
 11     }
 12     //创建共享享内存
 13     int shmid;                                 
 14     if((shmid=shmget(key,4096,IPC_CREAT|0664))=
 15     {
 16         perror("shmget");
 17         return -1;
 18     }   
 19     //映射到用户空间
 20     char *adder;
 21     if((adder=shmat(shmid,NULL,0))==(void *)-1)
 22     {
 23         perror("shmat");
 24         return -1;
 25     }   
 26     //创建一个信号灯集
 27     int semid;
 28     semid=init_sem(4);
 29     //创建父子进程
 30     pid_t pid;
 31     pid=fork();
 32     if(pid<0)
 33     {   
 34         perror("fork");
 35         return -1;
 36     }   
 37     else if(pid>0)
 38     {   
 39         //父进程
 40         while(1)
 41         {
 42             //等待0信号资源
 43             W(semid,0);
 44             fgets(adder,4096,stdin);
 45             adder[strlen(adder)-1]='\0';
 46             //释放1信号资源
 47             P(semid,1);
 48             if(strcmp(adder,"quit")==0)
 49             {
 50                 break;
 51             }   
 52         }
 53         wait(NULL);
 54     }   
 55     else    
 56     {   
 57         //子进程
 58         while(1)
 59         {   
 60             //等待3信号资源
 61             W(semid,3);
 62             //房子里面拿东西
 63             printf("共享内存数据:%s\n",adder);
 64                     //释放2信号资源
 65                     P(semid,2);
 66             if(strcmp(adder,"quit")==0)
 67             {
 68                 break;
 69             }   
 70         }   
 71         exit(EXIT_SUCCESS);
 72     }   
 73     //取消链接
 74     shmdt(adder);
 75     return 0;
 76 }

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

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

相关文章

【Python 千题 —— 基础篇】列表的最大值与最小值(for 循环版)

题目描述 题目描述 输出列表的最大值与最小值。题中有一个包含数字的列表 [11, 39, 100, 48, 392, 10, 9]&#xff0c;使用 for 循环输出这个列表的最大值与最小值。 输入描述 无输入。 输出描述 输出列表的最大值与最小值。 示例 示例 ① 输出&#xff1a; 列表的最…

【GitLab】-HTTP 500 curl 22 The requested URL returned error: 500~SSH解决

写在前面 本文主要介绍通过SSH的方式拉取GitLab代码。 目录 写在前面一、场景描述二、具体步骤1.环境说明2.生成秘钥3.GitLab添加秘钥4.验证SSH方式4.更改原有HTTP方式为SSH 三、参考资料写在后面系列文章 一、场景描述 之前笔者是通过 HTTP Personal access token 的方式拉取…

Redis 配置文件信息中文翻译版

前言 Redis 配置文件信息中文翻译版&#xff0c;方便大家阅读和理解对应参数信息及配置参数信息 # Redis configuration file example# Note on units: when memory size is needed, it is possible to specify # it in the usual form of 1k 5GB 4M and so forth: # 注意:当…

Django模型层

模型层 与数据库相关的&#xff0c;用于定义数据模型和数据库表结构。 在Django应用程序中&#xff0c;模型层是数据库和应用程序之间的接口&#xff0c;它负责处理所有与数据库相关的操作&#xff0c;例如创建、读取、更新和删除记录。Django的模型层还提供了一些高级功能 首…

Mars3d的timeline与locationBar样式重合问题处理方案

前置代码&#xff1a;配置了map的mapOptions &#xff0c;增加了默认的时间轴与下侧状态栏控件 export const mapOptions function (option) { option.control { timeline: { zoom: false, enabled: false }, // 方式1&#xff1a;options中添加控件 ; zoom - 禁止缩放 anim…

浏览器存储(localStorage和sessionStorage)

我们知道 js 写的效果&#xff0c;每次刷新都是从新执行&#xff0c;是不存在记录操作的&#xff0c;主要是大部分的效果不需要这样的处理 (一个 tab 切换&#xff0c;焦点图肯定不需要记住运行到哪里&#xff0c;刷新从新开始就好了)&#xff01; 在 html5 之前&#xff0c;前…

Oracle-动态sql学习笔记,由易至难讲解七个例子

本文章的内容来源于对oracle课堂上讲的内容做出的笔记 静态sql和动态sql 静态sql&#xff1a; 静态 SQL 是在编译时写死的 SQL 语句&#xff0c;即在程序编写阶段&#xff0c;SQL 语句已经被固定下来。 特点&#xff1a; 1.预编译&#xff1a; SQL 语句在程序编译时就会被…

【刷题专栏—突破思维】142. 环形链表 II

前言&#xff1a;本篇博客将讲解三个OJ题&#xff0c;前两个作为铺垫&#xff0c;最后完成环形链表的节点的寻找 文章目录 一、160. 相交链表二、141. 环形链表三、142. 环形链表II 一、160. 相交链表 题目链接&#xff1a;LeetCode—相交链表 题目描述&#xff1a; 给你两个单…

【VSCode】Visual Studio Code 配置简体中文环境教程

介绍 Visual Studio Code&#xff08;简称 VS Code&#xff09;是一款轻量级的代码编辑器&#xff0c;它支持多种编程语言&#xff0c;并且具有丰富的功能和插件扩展。如果你更喜欢使用简体中文界面&#xff0c;那么本教程将向你展示如何在 VS Code 中配置简体中文环境。 步骤…

如何调整图片尺寸:简单实用的教程分享

报名事业编考试的时候&#xff0c;会发现上传照片时会提示图片大小尺寸应该为多少&#xff0c;如果不符合规定就无法提交报名&#xff0c;那么怎么才能修改图片大小呢&#xff1f;最简单的方法就是利用调整照片大小工具来对图片尺寸修改&#xff0c;本文分享一个在线图片处理工…

如何提高领导力?

提升领导力的关键一方面要有正确的自我认知&#xff0c;另一方面就是坚持去实践&#xff0c;没有速成可言&#xff0c;没人那个人天生就具备领导力&#xff0c;有些人我们看起来是具有领导力的&#xff0c;但这些表象的背后可能是家庭环境的潜移默化&#xff0c;也有可能是个人…

智能导诊系统:基于机器学习和自然语言处理技术,可快速推荐合适的科室和医生

智能导诊系统是一种基于人工智能技术的新型系统&#xff0c;它能够为医院提供患者服务和管理&#xff0c;提高医院的管理效率和服务水平。 技术架构&#xff1a;springbootredismybatis plusmysqlRocketMQ 以下是智能导诊系统的应用场景和功能特点&#xff1a; 应用场景 1.患…

一个项目进行测试的一些最基本环境

在一个项目开发到发布的整个过程中&#xff0c;会使用到很多个环境进行测试和运行项目。最基本的开发环境、测试环境、准生产环境、生成环境 一、开发环境 开发环境顾名思义就是我们程序猿自己把项目放到自己的电脑上&#xff0c;配置好以后&#xff0c;跑起来项目&#xff0…

深度学习100例-卷积神经网络(CNN)实现mnist手写数字识别 | 第1天

文章目录 前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;我的环境&#xff1a; 2. 导入数据3.归一化4.可视化5.调整图片格式 二、构建CNN网络模型三、编译模型四、训练模型五、预测六、知识点详解1. MNIST手写数字数据集介绍2. 神经网络程序说明3. 网…

计算机毕业设计 基于Vue的米家商城系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

解决Qt5.13.0无MySQL驱动问题

一、前言 由于Qt5.12.3是最后提供mysql数据库插件的版本&#xff0c;往后的版本需要自行编译对应的mysql数据库插件&#xff0c;官方安装包不再提供。使用高版本的Qt就需要自行编译mysql驱动。 若没有编译在QT中调用Qsqldatabase库连接mysql时&#xff0c;提示出现如下问题&a…

全国矿产地空间分布数据

我国矿产资源总量丰富、品种齐全&#xff0c;但人均占有量不足世界平均水平&#xff0c;矿产资源质量较差&#xff0c;地理分布不均衡&#xff0c;大型、超大型矿和露采矿较少&#xff0c;开发利用率不足&#xff0c;选矿冶炼技术落后。我国铁矿、锰矿、铬铁矿、铜矿、铝土矿等…

YOLOv5独家原创改进:最新原创WIoU_NMS改进点,改进有效可以直接当做自己的原创改进点来写,提升网络模型性能精度

💡该教程为属于《芒果书》📚系列,包含大量的原创首发改进方式, 所有文章都是全网首发原创改进内容🚀 💡本篇文章为YOLOv5独家原创改进:独家首发最新原创WIoU_NMS改进点,改进有效可以直接当做自己的原创改进点来写,提升网络模型性能精度。 💡对自己数据集改进有效…

Postman内置动态参数以及自定义的动态参数

近期在复习Postman的基础知识&#xff0c;在小破站上跟着百里老师系统复习了一遍&#xff0c;也做了一些笔记&#xff0c;希望可以给大家一点点启发。 一&#xff09;内置动态参数 {{$timestamp}} 生成当前时间的时间戳{{$randomInt}} 生成0-1000之间的随机数{{$guid}} 生成随…

基于平衡优化器算法优化概率神经网络PNN的分类预测 - 附代码

基于平衡优化器算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于平衡优化器算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于平衡优化器优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针…