IO进程:信号灯集

程序代码:

sem.h:

  1 #ifndef __SEM_H__2 #define __SEM_H__3 4 //创建信号灯集并初始化,semcount表示灯个数5 int open_sem(int semcount);6 7 //申请资源操作,semno表示灯的编号8 int P(int semid,int semno);9 10 //释放资源操作,semno表示灯的编号11 int V(int semid,int semno);12 13 //删除信号灯集14 int del_sem(int semid);15 16 #endif                                                                                            
~             

sem.c:

  1 #include<myhead.h>2 union semun3 {4     int val;5     struct semid_ds *buf;6     unsigned short *array;7     struct seminfo *__buf;8 };9 //定义给信号灯集中的指定信号灯赋值10 int init_semno(int semid,int semno)11 {12     union semun buf;13     printf("请输入要给编号为%d的灯设置的值:",semno);14     scanf("%d",&buf.val);15     //调用控制函数16     if(semctl(semid,semno,SETVAL,buf)==-1)17     {18         perror("semctl error");19         return -1;20     }21     return 0;22 }23 //创建或打开共享内存,参数为要申请的信号灯集中包含的灯的个数,返回值信号灯集的id24 int open_sem(int semcount)25 {26     //创建key值27     key_t key=-1;28     if((key=ftok("/",'s'))==-1)29     {30         perror("ftok error");31         return -1;32     }33     //通过key值创建一个信号灯集34     int semid=-1;35     if((semid=semget(key,semcount,IPC_CREAT|IPC_EXCL|0664))==-1)36     {37         //对错误码判断,EEXIST,说明信号灯集已存在38         if(errno==EEXIST)39         {40             //直接打开信号灯集即可41             semid=semget(key,semcount,IPC_CREAT|0664);42             return semid;43         }44         perror("semget error");45         return -1;46     }47     //给信号灯集的每个灯进行初始化操作48     for(int i=0;i<semcount;i++)49     {50         //对编号为i的灯进行初始化51         init_semno(semid,i);52     }53     return semid;54 }55 //进行申请资源操作,参数要申请的信号灯id,以及灯的编号56 int P(int semid,int semno)57 {58     //定义要执行操作的结构体变量59     struct sembuf buf;60     buf.sem_num=semno;61     buf.sem_op=-1;//申请资源62     buf.sem_flg=0;//阻塞方式申请63     //执行函数64     if(semop(semid,&buf,1)==-1)65     {66         perror("P error");67         return -1;68     }69     return 0;70 }71 //进行释放资源操作,参数为要申请的信号灯id,以及灯的编号72 int V(int semid,int semno)73 {74     struct sembuf buf;75     buf.sem_num=semno;76     buf.sem_op=1;77     buf.sem_flg=0;78     if(semop(semid,&buf,1)==-1)79     {80         perror("V error");81         return -1;82     }83     return 0;84 }85 //删除信号灯集的操作,参数为要删除的信号灯集86 int del_sem(int semid)87 {88     //删除信号灯集89     if(semctl(semid,0,IPC_RMID)==-1)                                                                                                                                                                                                                                         90     {91         perror("delete error");92         return -1;93     }94     return 0;95 }
~              

shmsnd.c:

  1 #include<myhead.h>2 #include "1.h"3 #define PAGE_SIZE 40964 int main(int argc, const char *argv[])5 {6     //11.创建并初始化一个信号灯集7     int semid=open_sem(2);8     //1.创建key值9     key_t key=-1;10     if((key=ftok("/",'k'))==-1)11     {12         perror("ftok error");13         return -1;14     }15     printf("key=%d\n",key);16     //2.将物理内存创建出共享内存段17     int shmid=-1;18     if((shmid=shmget(key,PAGE_SIZE,IPC_CREAT|0664))==-1)19     {20         perror("shmget error");21         return -1;22     }23     printf("shmid=%d\n",shmid);24     //3.将共享内存段地址映射到用户空间25     //NULL表示让系统自动选择页的分段26     //0表示当前进程对共享内存具有读写功能27     char *addr=(char *)shmat(shmid,NULL,0);28     if(addr==(void*)-1)29     {30         perror("shmat error");31         return -1;32     }33     printf("addr=%p\n",addr);34     //4.操作共享内存35     //char buf[128]="";36     while(1)37     {38         //22.申请0号灯的资源39         P(semid,0);40         printf("请输入>>>");41         fgets(addr,PAGE_SIZE,stdin);//从终端输入数据42         addr[strlen(addr)-1]='\0';//将换行换成'\0'43         printf("发送成功\n");44         //33.释放1号灯的资源45         V(semid,1);46         if(strcmp(addr,"quit")==0)47             break;48     }49     //5.取消映射50     if(shmdt(addr)==-1)51     {52         perror("shmdt error");53         return -1;54     }55     //6.删除共享内存56     if(shmctl(shmid,IPC_RMID,NULL)==-1)57     {58         perror("shmctl error");59         return -1;60     }61     return 0;62 }                                                                                                                                                                                                       
~          

 shmrcv:

  1 #include<myhead.h>2 #include"1.h"3 #define PAGE_SIZE 40964 int main(int argc, const char *argv[])5 {6     //11.创建信号灯集7     int semid=open_sem(2);8     //1.创建key值9     key_t key=-1;10     if((key=ftok("/",'k'))==-1)11     {12         perror("ftok error");13         return -1;14     }15     printf("key=%d\n",key);16     //2.将物理内存创建共享内存段17     int shmid=-1;18     if((shmid=shmget(key,PAGE_SIZE,IPC_CREAT|0664))==-1)19     {20         perror("shmget error");21         return -1;22     }23     printf("shmid=%d\n",shmid);24     //3.将共享内存段地址映射到用户空间25     //NULL表示让系统自动选择页分段26     //0表示当前进程对共享内存的读写功能27     char *addr=(char*)shmat(shmid,NULL,0);28     if(addr==(void*)-1)29     {30         perror("shmat error");31         return -1;32     }33     printf("addr=%p\n",addr);34     //4.操作共享内存35     //char buf[128]="";                                                                                                             36     while(1)37     {38         //22.申请1号灯的资源39         P(semid,1);40         printf("共享内存中的数据为:%s\n",addr);41         if(strcmp(addr,"quit")==0)42             break;43         //33.释放0号灯的资源44         V(semid,0);45     }46     //5.取消映射47     if(shmdt(addr)==-1)48     {49         perror("shmdt error");50         return -1;51     }52     //44.删除信号灯集53     del_sem(semid);54     return 0;55 }
~          

运行结果:

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp播放mp4省流方案

背景&#xff1a; 因为项目要播放一个宣传和讲解视频&#xff0c;视频文件过大&#xff0c;同时还为了节省存储流量&#xff0c;想到了一个方案&#xff0c;用m3u8切片替代mp4。 m3u8&#xff1a;切片播放&#xff0c;可以理解为一个1G的视频文件&#xff0c;自行设置文…

【前端素材】推荐优质后台管理系统Be admin平台模板(附源码)

一、需求分析 后台管理系统&#xff08;或称作管理后台、管理系统、后台管理平台&#xff09;是一种专门用于管理网站、应用程序或系统后台运营的软件系统。它通常由一系列功能模块组成&#xff0c;为管理员提供了管理、监控和控制网站或应用程序的各个方面的工具和界面。以下…

Spring-IoC

文章目录 Spring IoC一、IoC概述1、概述2、IoC原理3、IoC作用4、Spring Bean 二、Spring容器 相关接口1、BeanFactory2、ApplicationContext1&#xff09;HierarchicalBeanFactory2&#xff09;ListableBeanFactory3&#xff09;EnvironmentCapable4&#xff09;ApplicationEve…

Web3 基金会推出去中心化之声计划:投入高额 DOT 和 KSM ,助力去中心化治理

作者&#xff1a;Web3 Foundation Team 编译&#xff1a;OneBlock 原文&#xff1a;https://medium.com/web3foundation/decentralized-voices-program-93623c27ae43 Web3 基金会为 Polkadot 和 Kusama 创建了去中心化之声计划&#xff08;Decentralized Voices Program&…

软考39-上午题-【数据库】-关系代数运算1-传统的集合运算

一、笛卡尔积 二、关系代数 关系代数是施加于关系之上的集合代数运算。 关系代数包含&#xff1a; 传统的集合运算专门的关系运算 2-1、传统的集合运算 1、关系的并 示例&#xff1a; 2、关系的差 示例&#xff1a; 3、关系的交 示例&#xff1a; 关系的并、差、交&#xf…

LeetCode 448.找到所有数组中消失的数字

目录 1.题目 2.代码及思路 3.进阶 3.1题目 3.2代码及思路 1.题目 给你一个含 n 个整数的数组 nums &#xff0c;其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字&#xff0c;并以数组的形式返回结果。 示例 1&#xff1a; 输入&am…

【数学建模入门】

数学建模入门 数学建模需要的学科知识怎么学习数学模型如何读好一篇优秀论文数学建模赛题常见类别数学建模常见问题数学建模组队和分工数学建模准备工作 数学建模需要的学科知识 怎么学习数学模型 &#x1f4a6;推荐阅读书籍&#xff1a; 《数学建模算法与应用》&#xff0c;…

车规级MCU的行业走向

1 主要厂家 车规级MCU&#xff08;车用微控制器单元&#xff09;的主要厂家包括&#xff1a; NXP半导体&#xff1a;NXP是全球领先的车规级MCU提供商之一&#xff0c;提供广泛的产品用于汽车控制和管理系统。英飞凌科技&#xff1a;作为汽车半导体的领导者之一&#xff0c;英飞…

fly-barrage 前端弹幕库(1):项目介绍

fly-barrage 是我写的一个前端弹幕库&#xff0c;由于经常在 Bilibili 上看视频&#xff0c;所以对网页的弹幕功能一直蛮感兴趣的&#xff0c;所以做了这个库&#xff0c;可以帮助前端快速的实现弹幕功能。 项目官网地址&#xff1a;https://fly-barrage.netlify.app/&#xff…

旅游分享系列之:福建旅游攻略

旅游分享系列之&#xff1a;福建旅游攻略 一、漳州1.福建土楼2.云水谣3.四菜一汤景点 二、厦门1.园林博览苑2.海上自行车道3.山海步道4.海滩5.闽南菜6.落日 三、泉州1.衙口沙滩2.海上日出3.珞珈寺4.海滩烟花 一、漳州 游玩2个景点&#xff1a;云水谣&#xff0c;四菜一汤可以住…

《图解HTTP》笔记2:http的构成

目录 1&#xff0c;查看浏览器上面一个具体的http请求 2&#xff0c;HTTP报文的具体构成 2.1&#xff0c;http的报文结构 2.2&#xff0c;http的请求报文例子 2.3&#xff0c;http的响应报文例子 1&#xff0c;查看浏览器上面一个具体的http请求 浏览器地址栏输入网址&…

ES6内置对象 - Set

Set&#xff08;es6提供的一种数据结构&#xff0c;类似数组&#xff0c;是一个集合&#xff0c;可以存储任何类型的元素且唯一、不重复&#xff0c;so,多用于元素去重&#xff09; 如上图&#xff0c;Set数据结构自带一些方法 1.Set对象创建 let a new Set([1,2,3,3,1,2,4,…

spring boot3登录开发-2(1图形验证码接口实现)

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途。 目录 前置条件 内容简介 图形验证码接口实现 导入糊涂工具依赖 接口分析 编写验证码接口 测试验证码接口 前置条件 …

浅浅的画一个STDP的图像吧

stdp最重要的是两个窗口函数 根据这个方程我们刻画出他的轨迹&#xff0c;代码如下 import numpy as np import matplotlib.pyplot as plt# 定义STDP参数 tau_pos 30 # 正向突触权重变化的时间常数 tau_neg 30 # 负向突触权重变化的时间常数 A_pos 0.1 # 正向突触权重变…

都说了别用BeanUtils.copyProperties,这不翻车了吧

分享是最有效的学习方式。 博客&#xff1a;https://blog.ktdaddy.com/ 故事 新年新气象&#xff0c;小猫也是踏上了新年新征程&#xff0c;自从小猫按照老猫给的建议【系统梳理大法】完完整整地梳理完毕系统之后&#xff0c;小猫对整个系统的把控可谓又是上到可一个新的高度。…

[计算机网络]--IP协议

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、IP协议…

大数据构建知识图谱:从技术到实战的完整指南

文章目录 大数据构建知识图谱&#xff1a;从技术到实战的完整指南一、概述二、知识图谱的基础理论定义与分类核心组成历史与发展 三、知识获取与预处理数据源选择数据清洗实体识别 四、知识表示方法知识表示模型RDFOWL属性图模型 本体构建关系提取与表示 五、知识图谱构建技术图…

低功耗设计——门控时钟

1. 前言 芯片功耗组成中&#xff0c;有高达40%甚至更多是由时钟树消耗掉的。这个结果的原因也很直观&#xff0c;因为这些时钟树在系统中具有最高的切换频率&#xff0c;而且有很多时钟buffer&#xff0c;而且为了最小化时钟延时&#xff0c;它们通常具有很高的驱动强度。此外&…

2024Node.js零基础教程(小白友好型),nodejs新手到高手,(九)NodeJS入门——http模块

060_http模块_网页URL之绝对路径 hello&#xff0c;大家好&#xff0c;这一个小题的话我们来补充一个之前学习过的内容&#xff0c;就是网页当中的URL&#xff0c;咱们这个小题的话主要是来说一下绝对路径&#xff0c;有同学可能会说&#xff0c;这这这&#xff0c;不对劲&…

yolov8学习笔记(二)模型训练

目录 yolov8的模型训练 1、制作数据集&#xff08;标记数据集&#xff09; 2、模型训练&#xff08;标记数据集、参数设置、跟踪模型随时间的性能变化&#xff09; 2.1、租服务器训练 2.2、加训练参数 2.3、看训练时的参数&#xff08;有条件&#xff0c;就使用TensorBoard&…