IO进程线程day8作业

信号灯集二次函数封装

sem.c

#include<myhead.h>union semun
{int              val;    /* Value for SETVAL */struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */unsigned short  *array;  /* Array for GETALL, SETALL */struct seminfo  *__buf;  /* Buffer for IPC_INFO(Linux-specific) */
};//定义给信号灯集中的指定信号灯进行赋值
int init_semno(int semid,int semno)
{union semun buf;printf("请输入要给编号为%d的灯设置的值:",semno);scanf("%d",&buf.val);getchar();//调用控制函数if(semctl(semid,semno,SETVAL,buf)==-1){perror("semctl error");return -1;}return 0;
}
//创建或打开共享内存
int open_sem(int semcount)
{//创建key值key_t key=-1;if((key=ftok("/",'s'))==-1){perror("ftok error");return -1;}//通过key值创建一个信号灯集int semid =-1;if((semid=semget(key,semcount,IPC_CREAT|0064))==-1){//对错误码进行判断,if(errno==EEXIST){//直接打开信号灯集即可semid=semget(key,semcount,IPC_CREAT|0664);return semid;}perror("semget error");return -1;}//给信号灯集中的每个灯进行初始化for(int i=0;i<semcount;i++){init_semno(semid,i);}return semid;
}//进行资源申请操作
int P(int semid,int semno)
{//定义要进行的结构体变量struct sembuf buf;buf.sem_num=semno;buf.sem_op=-1;buf.sem_flg=0;//执行函数if(semop(semid,&buf,1)==-1){perror("P error");return -1;}return 0;
}//进行资源释放操作
int V(int semid,int semno)
{//定义要进行的结构体变量struct sembuf buf;buf.sem_num=semno;buf.sem_op=1;buf.sem_flg=0;//执行函数if(semop(semid,&buf,1)==-1){perror("V error");return -1;}return 0;
}//删除信号灯集
int del_sem(int semid)
{//删除信号灯集if(semctl(semid,0,IPC_RMID)==-1){perror("delete error");return -1;}return 0;
}

sem.h

#ifndef _SEM_H_
#define _SEM_H_
//创建或打开共享内存:参数为要申请的信号灯集中包含的灯的个数,返回信号灯集的id
int open_sem(int semcount);//进行资源申请操作:参数为要申请的信号灯id,以及灯的编号
int P(int semid,int semno);//进行释放资源操作:参数为要申请的信号灯,以及灯的编号
int V(int semid,int semno);//删除信号灯集的操作:参数为要删除的信号灯集id
int del_sem(int semid);#endif

shmsnd.c

#include<myhead.h>union semun
{int              val;    /* Value for SETVAL */struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */unsigned short  *array;  /* Array for GETALL, SETALL */struct seminfo  *__buf;  /* Buffer for IPC_INFO(Linux-specific) */
};//定义给信号灯集中的指定信号灯进行赋值
int init_semno(int semid,int semno)
{union semun buf;printf("请输入要给编号为%d的灯设置的值:",semno);scanf("%d",&buf.val);getchar();//调用控制函数if(semctl(semid,semno,SETVAL,buf)==-1){perror("semctl error");return -1;}return 0;
}
//创建或打开共享内存
int open_sem(int semcount)
{//创建key值key_t key=-1;if((key=ftok("/",'s'))==-1){perror("ftok error");return -1;}//通过key值创建一个信号灯集int semid =-1;if((semid=semget(key,semcount,IPC_CREAT|0064))==-1){//对错误码进行判断,if(errno==EEXIST){//直接打开信号灯集即可semid=semget(key,semcount,IPC_CREAT|0664);return semid;}perror("semget error");return -1;}//给信号灯集中的每个灯进行初始化for(int i=0;i<semcount;i++){init_semno(semid,i);}return semid;
}//进行资源申请操作
int P(int semid,int semno)
{//定义要进行的结构体变量struct sembuf buf;buf.sem_num=semno;buf.sem_op=-1;buf.sem_flg=0;//执行函数if(semop(semid,&buf,1)==-1){perror("P error");return -1;}return 0;
}//进行资源释放操作
int V(int semid,int semno)
{//定义要进行的结构体变量struct sembuf buf;buf.sem_num=semno;buf.sem_op=1;buf.sem_flg=0;//执行函数if(semop(semid,&buf,1)==-1){perror("V error");return -1;}return 0;
}//删除信号灯集
int del_sem(int semid)
{//删除信号灯集if(semctl(semid,0,IPC_RMID)==-1){perror("delete error");return -1;}return 0;
}ubuntu@ubuntu:~/IO进程线程/2.26/sem$ 
ubuntu@ubuntu:~/IO进程线程/2.26/sem$ sem.h
sem.h:未找到命令
ubuntu@ubuntu:~/IO进程线程/2.26/sem$ cat sem.h
#ifndef _SEM_H_
#define _SEM_H_
//创建或打开共享内存:参数为要申请的信号灯集中包含的灯的个数,返回信号灯集的id
int open_sem(int semcount);//进行资源申请操作:参数为要申请的信号灯id,以及灯的编号
int P(int semid,int semno);//进行释放资源操作:参数为要申请的信号灯,以及灯的编号
int V(int semid,int semno);//删除信号灯集的操作:参数为要删除的信号灯集id
int del_sem(int semid);#endif
ubuntu@ubuntu:~/IO进程线程/2.26/sem$ ubuntu@ubuntu:~/IO进程线程/2.26/sem$ cat shmsnd.c
#include<myhead.h>
#include"sem.h"
//一页大小
#define PAGE_SIZE 4096
int main(int argc, const char *argv[])
{//11.创建信号灯集int semid=open_sem(2);//1.创建key值key_t key=-1;if((key=ftok("/",'k'))==-1){perror("ftok error");return -1;}printf("key=%d\n",key);//2.通过keu值创建一个共享内存int shmid=-1;if((shmid=shmget(key,PAGE_SIZE,IPC_CREAT|0064))==-1){perror("shmget error");return -1;}printf("shmid=%d\n",shmid);//3.将共享内存段的数据映射到内存空间char *addr = shmat(shmid,NULL,0);if(addr==(void*)-1){perror("shmat error");return -1;}printf("addr=%p\n",addr);//4.使用共享内存while(1){//22.申请0号灯的资源P(semid,0);printf("please enter:");fgets(addr,PAGE_SIZE,stdin);addr[strlen(addr)-1]=0;printf("数据发送成功\n");//33.释放一号灯的资源V(semid,1);//判断输入内容if(strcmp(addr,"quit")==0){break;}}//5.取消映射关系if(shmdt(addr)==-1){perror("shmdt error");return -1;}//6.删除共享内存if(shmctl(shmid,IPC_RMID,NULL)==-1){perror("shmctl error");return -1;}return 0;
}

shmrcv.c

#include<myhead.h>
#include"sem.h"
//一页大小
#define PAGE_SIZE 4096
int main(int argc, const char *argv[])
{//11.创建信号灯集int semid = open_sem(2);//1.创建key值key_t key=-1;if((key=ftok("/",'k'))==-1){perror("ftok error");return -1;}printf("key=%d\n",key);//2.通过key值创建一个共享内存int shmid=-1;if((shmid=shmget(key,PAGE_SIZE,IPC_CREAT|0064))==-1){perror("shmget error");return -1;}printf("shmid=%d\n",shmid);//3.将共享内存段的数据映射到内存空间char *addr = shmat(shmid,NULL,0);if(addr==(void*)-1){perror("shmat error");return -1;}printf("addr=%p\n",addr);//4.使用共享内存while(1){//22.申请一号灯的资源P(semid,1);//	sleep(1);printf("get text:%s\n",addr);//判断读取内容if(strcmp(addr,"quit")==0){break;}//33.释放0号灯的资源V(semid,0);}//5.取消映射关系if(shmdt(addr)==-1){perror("shmdt error");return -1;}//44.删除信号灯集del_sem(semid);return 0;
}

思维导图:

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

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

相关文章

Educational Codeforces Round 162 (Rated for Div. 2)(A~D)

A. Moving Chips 分析&#xff1a;先找出区间[l,r]&#xff0c;a[l]为1第一次出现&#xff0c;a[r]为1最后一次出现&#xff0c;[l,r]以外的区间不用管。 所以我们要将[l,r]中所有1的区域块练成一块。 经过简单的样例分析发现&#xff0c;假设1的区域t1和区域t2间有x个0&…

springboot+vue实现微信公众号扫码登录

通常在个人网站中&#xff0c;都会有各种第三方登录&#xff0c;其中微信登录需要认证才能使用&#xff0c;导致个人开发者不能进行使用此功能&#xff0c;但是我们可以使用微信公众号回复特定验证码来进行登录操作。 微信关键词处理 微信公众号关键词自动回复&#xff0c;具体…

第3.5章:StarRocks数据导入——Broker Load

注&#xff1a;本篇文章阐述的是StarRocks-3.2版本的Broker Load导入机制 一、概述 Broker Load导入方式支持从HDFS类的外部存储系统&#xff08;例如&#xff1a;HDFS、阿里OSS、腾讯COS、华为云OBS等&#xff09;&#xff0c;支持Parquet、ORC、CSV、及 JSON 四种文件格式&a…

c#程序,oracle使用Devart驱动解决第第三方库是us7ascii,数据乱码的问题

最近做项目&#xff0c;要跟对方系统的库进行读写&#xff0c;结果发现对方采用的是oracle的us7ascii编码&#xff0c;我们系统默认采用的是ZHS16GBK&#xff0c;导致我们客户端读取和写入对方库的数据都是乱码&#xff0c;搜索网上&#xff0c;发现需要采用独立的oracle驱动去…

【GPTs分享】GPTs分享之Write For Me

Write For Me 是一个专门定制的GPT版本&#xff0c;旨在为用户提供高质量的文本内容创作服务。它适用于各种写作需求&#xff0c;从商业计划、学术文章到创意故事等。下面是从简介、主要功能、使用案例、优点和局限性几个方面对Write For Me 的详细介绍。 简介 Write For Me …

【初始RabbitMQ】高级发布确认的实现

在生产环境中由于一些不明原因&#xff0c;导致 rabbitmq 重启&#xff0c;在 RabbitMQ 重启期间生产者消息投递失败&#xff0c; 导致消息丢失&#xff0c;需要手动处理和恢复。于是&#xff0c;我们开始思考&#xff0c;如何才能进行 RabbitMQ 的消息可靠投递呢&#xff1f; …

常用实验室器皿耐硝酸盐酸进口PFA材质容量瓶螺纹盖密封效果好

PFA容量瓶规格参考&#xff1a;10ml、25ml、50ml、100ml、250ml、500ml、1000ml。 别名可溶性聚四氟乙烯容量瓶、特氟龙容量瓶。常用于ICP-MS、ICP-OES等痕量分析以及同位素分析等实验&#xff0c;也可在地质、电子化学品、半导体分析测试、疾控中心、制药厂、环境检测中心等机…

蜣螂优化算法DBO求解不闭合SD-MTSP,可以修改旅行商个数及起点(提供MATLAB代码)

一、蜣螂优化算法&#xff08;Dung beetle optimizer&#xff0c;DBO&#xff09; 蜣螂优化算法&#xff08;Dung beetle optimizer&#xff0c;DBO&#xff09;由Jiankai Xue和Bo Shen于2022年提出&#xff0c;该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁殖行为的启发所得…

YOLOv9-Openvino和ONNXRuntime推理【CPU】

1 环境&#xff1a; CPU&#xff1a;i5-12500 Python&#xff1a;3.8.18 2 安装Openvino和ONNXRuntime 2.1 Openvino简介 Openvino是由Intel开发的专门用于优化和部署人工智能推理的半开源的工具包&#xff0c;主要用于对深度推理做优化。 Openvino内部集成了Opencv、Tens…

开源大语言模型作为 LangChain 智能体

概要 开源大型语言模型 (LLMs) 现已达到一种性能水平&#xff0c;使它们适合作为推动智能体工作流的推理引擎: Mixtral 甚至在我们的基准测试中 超过了 GPT-3.5&#xff0c;并且通过微调&#xff0c;其性能可以轻易的得到进一步增强。 引言 针对 因果语言建模 训练的大型语言模…

使用 npm/yarn 等命令的时候会,为什么会发生 Error: certificate has expired

缘起 昨天&#xff0c;我写了一篇文章&#xff0c;介绍如何使用项目模板&#xff0c;构建一个 Electron 项目的脚手架&#xff0c;我发现我自己在本地无法运行成功&#xff0c;出现了错误。 ✖ Failed to install modules: ["electron-forge/plugin-vite^7.2.0",&qu…

golang学习3,golang 项目中配置gin的web框架

1.go 初始化 mod文件 go mod init gin-ranking 2.gin的crm框架 go get -u github.com/gin-gonic/gin 3.go.mod爆红解决

C# 通过共享内存调用C++ 算法

需求&#xff1a; C#程序调用 C开发的dll. 一种C# 程序调用c 算法方案_算法怎么被c#调用-CSDN博客 上回书说到&#xff0c;将c算法封装为dll 插件&#xff0c;c加载后&#xff0c;暴露C风格接口&#xff0c;然后供C#调用。但是这样有几个问题&#xff1a; 1&#xff0c;一是…

详解POCV/SOCV的时序报告

​POCV/SOCV的时序报告中有如下变量&#xff1a; Mean: 高斯分布中的μ值&#xff08;平均值&#xff09; Sensit: sensitivity&#xff0c;也就是1个Sigma的值&#xff1b; Corner: Sigma边界的最差值 cell的delay Delay mean N * Delay sigma; cell 的Transition Sl…

【程序员英语】【美语从头学】初级篇(入门)(笔记)Lesson 16 At the Shoe Store 在鞋店

《美语从头学初级入门篇》 注意&#xff1a;被 删除线 划掉的不一定不正确&#xff0c;只是不是标准答案。 文章目录 Lesson 16 At the Shoe Store 在鞋店对话A对话B笔记会话A会话B替换 Lesson 16 At the Shoe Store 在鞋店 对话A A: Do you have these shoes in size 8? B:…

备战蓝桥杯---树形DP基础1

我们先来看几个比较简单的例子来引入&#xff1a; 我们令f[i]表示以i为根节点的子树大小&#xff0c;易得状态转移方程为&#xff1a; f[i]1f[son1]....f[soni]; 我们用DFS即可&#xff0c;下面是大致的模板&#xff1a; 让我们来看看几道题吧&#xff1a; 1.贪心树形DPDFS&…

多输入时序预测|GWO-CNN-LSTM|灰狼算法优化的卷积-长短期神经网络时序预测(Matlab)

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 灰狼优化算法&#xff1a; 卷积神经网络-长短期记忆网络&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容…

【教程】 iOS混淆加固原理篇

目录 摘要 引言 正文 1. 加固的缘由 2. 编译过程 3. 加固类型 1) 字符串混淆 2) 类名、方法名混淆 3) 程序结构混淆加密 4) 反调试、反注入等一些主动保护策略 4. 逆向工具 5. OLLVM 6. IPA guard 7. 代码虚拟化 总结 摘要 本文介绍了iOS应用程序混淆加固的缘由…

oracle官网下载早期jdk版本

Java Downloads | Oracle JDK Builds from Oracle 以上压缩版&#xff0c;以下安装版 Java Downloads | Oracle 该链接往下拉能看到jdk8和jdk11的安装版 -- end

https://htmlunit.sourceforge.io/

https://htmlunit.sourceforge.io/ 爬虫 HtmlUnit – Welcome to HtmlUnit HtmlUnit 3.11.0 API https://mvnrepository.com/artifact/net.sourceforge.htmlunit/htmlunit/2.70.0 https://s01.oss.sonatype.org/service/local/repositories/releases/content/org/htmlunit…