IO进程线程:将信号灯集的相关函数二次封装

sem.h

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

sem.c

#include<myhead.h>union semun 
{int val;    struct semid_ds *buf;     unsigned short  *array;   struct seminfo  *__buf; 						
};
//定义给信号灯集中的指定信号灯进行赋值
int init_semno(int semid,int semno)
{union semun buf;printf("请输入要给编号为%d的灯设置的值:",semno);scanf("%d",&buf.val);getchar();//调用控制函数if(semctl(semid,semno,SETVAL,buf)){perror("semctl error");return -1;}return 0;
}
//创建或打开共享内存:参数为要申请的信号灯集中包含的灯的个数,返回值信号灯集的id
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|IPC_EXCL|0664))==-1){//对错误码进行判断,如果错误码为EEXIST,说明信号灯集以及存在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);//对编号为i的灯进行初始化}return semid;
}//进行申请资源操作:参数为要申请的信号灯id,以及灯的编号
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;
}//进行释放资源操作:参数为要申请的信号灯id,以及灯的编号
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;	
}//删除信号灯集的操作:参数为要删除的信号灯集id
int del_sem(int semid)
{//删除信号灯集的操作if(semctl(semid,0,IPC_RMID)==-1){perror("delete error");return -1;}return 0;
}

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.通过key值创建一个共享内存int shmid=-1;if((shmid=shmget(key,PAGE_SIZE,IPC_CREAT|0664))==-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("请输入>>>");fgets(addr,PAGE_SIZE,stdin);addr[strlen(addr)-1]=0;printf("数据发送成功\n");//33.释放1号灯资源V(semid,1);//判断输入内容if(strcmp(addr,"quit")==0)break;if(strcmp(addr,"q")==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|0664))==-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){//申请1号灯资源P(semid,1);printf("收到的数据为:%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.hqwc.cn/news/492649.html

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

相关文章

第九篇:SQL语法-DCL-数据控制语言

DCL英文全称是Data ControlLanquage&#xff08;数据控制语言&#xff09;&#xff0c;用来管理数据库用户&#xff0c;控制数据库的访问权限 DCL主要包含两方面的操作&#xff0c; 用户管理&#xff08;控制哪些用户能访问数据库&#xff09;权限控制&#xff08;控制用户能访…

Unity—MVC分层开发思想

每日一句&#xff1a;当你不努力的时候&#xff0c;天赋就会一点一点被收回 目录 MVC分层开发思想 MVC是什么 MVC的开发步骤 案例&#xff1a;点击按钮实现金币进行添加&#xff0c;并且把金币记录到JSON里 MVC模式实现 背包系统基础代码 背包项目实现步骤 MVC分层开发思…

不会PS怎么抠图换背景?推荐两个AI抠图方法

在数字化创意的世界里&#xff0c;我们常常被那些精美的图片所吸引&#xff0c;但有时候&#xff0c;我们更希望将图片中的某个元素单独提取出来&#xff0c;以便进行更深入的编辑、更自由的创作。此时&#xff0c;抠图软件便如同一位精湛的雕刻家&#xff0c;将图片中的细节一…

编程的基础:理解时间和空间复杂度

编程的基础&#xff1a;理解时间和空间复杂度 时间复杂度空间复杂度示例常数时间复杂度 O(1)线性时间复杂度 O(n)线性对数时间复杂度 O(n log n)二次时间复杂度 O(n^2)指数时间复杂度 O(2^n) 空间复杂度示例常数空间复杂度 O(1)线性空间复杂度 O(n)线性对数空间复杂度 O(log n)…

Jmeter学习系列之八:控制器Controllers 的入门介绍

一、Controllers 简介 Jmeter有两种类型的控制器&#xff1a;Samplers&#xff08;取样器&#xff09;和Logical Controllers&#xff08;逻辑控制器&#xff09;&#xff1b;它们驱动着测试的进行取样器&#xff1a;让jmeter发送请求到服务器以及接收服务器的响应数据逻辑控制…

字节、腾讯、华为等50家大厂年终奖曝光,技术岗依旧很吃香!

一、大厂年终奖发放时间与数额 每到年末&#xff0c;年终奖就成了大家关心的话题&#xff0c;今年情况怎么样呢&#xff1f; 我们来看看互联网大厂的年终奖就知道了&#xff0c;先来看看发放时间。 一般来说&#xff0c;大厂年终奖发放多集中在12月-2月发放。 从上图一些网友…

【Spring Cloud】高并发带来的问题及常见容错方案

文章目录 高并发带来的问题编写代码修改配置压力测试修改配置&#xff0c;并启动软件添加线程组配置线程并发数添加Http取样配置取样&#xff0c;并启动测试访问message方法观察效果 服务雪崩效应常见容错方案常见的容错思路常见的容错组件 总结 欢迎来到阿Q社区 https://bbs.c…

3分钟快速实现串口PLC远程下载程序操作说明

3分钟快速实现串口PLC远程下载程序操作说明 搜索蓝蜂物联网官网&#xff0c;即可免费领取样机使用&#xff01;&#xff01;先到先得&#xff01;&#xff01;&#xff01; 一. 适用产品型号 其余型号网关此功能正在开发中&#xff0c;敬请期待。 二. 远程下载功能使用流程 …

基于STM32的儿童智能安全防护书包设计

一、前言 1.1 项目介绍 【1】项目功能介绍 随着社会的进步和科技的发展&#xff0c;儿童安全问题日益引起广泛关注。在日常生活中&#xff0c;尤其是在上学放学途中、户外活动时&#xff0c;儿童走失事件时有发生&#xff0c;给家庭和社会带来了极大的困扰和担忧。随着学业负…

ad如何生成gerber文件

1 2 3 4 5 6 7 8![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f576afa92b054a5ca68bc383a4c3c27d.png#pic_ce 8 9 10

乡村研学|乡村研学小程序|基于微信小程序的乡村研学平台设计与实现(源码+数据库+文档)

乡村研学小程序目录 目录 基于微信小程序的乡村研学平台设计与实现 一、前言 二、系统功能设计 三、系统实现 1、微信小程序前台 2、管理员后台 &#xff08;1&#xff09;乡村研学管理 &#xff08;2&#xff09;商品信息管理 &#xff08;3&#xff09;商品类型管理 …

C++ 入门(六)— 调试程序(Debugging)

文章目录 语法和语义错误调试(Debugging)调试过程调试策略常用的调试策略更多调试策略 使用集成调试器步进&#xff08;Stepping&#xff09; 语法和语义错误 语法错误 编写根据 C 语言的语法无效的语句时&#xff0c;会发生语法错误。例如缺少分号、使用未声明的变量、括号或…