封装信号灯集相关API

news2024/9/24 23:28:13

由信号灯实现通信。

发送端send.c代码:

#include <myhead.h>
#include "./sem.h"
#define PAGE_SIZE 4096
int main(int argc, const char *argv[])
{
	int semid = semID_get(2);//创建2个信号灯

	key_t key = ftok("./",'U');
	if(key==-1)
	{
		perror("ftok");
		return -1;
	}

	int shmID = shmget(key,PAGE_SIZE,IPC_CREAT|0664);
	if(shmID==-1)
	{
		perror("shmget");
		return -1;
	}
	

	char *sendbuff = shmat(shmID,NULL,0);//映射出共享内存
	if(sendbuff==(void *)-1)
	{
		perror("shmat");
		return -1;
	}

	while(1)
	{
		P(semid,0);//申请0号灯资源
		printf("请输入你的信息:");
		fgets(sendbuff,PAGE_SIZE,stdin);
		sendbuff[strlen(sendbuff)-1]='\0';
		V(semid,1);//释放1号灯资源

		if(strcmp("quit",sendbuff)==0)
		{
			break;
		}

	}
	if(shmdt(sendbuff)==-1)
	{
		perror("shmat");
		return  -1;
	}

	if(shmctl(shmID,IPC_RMID,NULL)==-1)
	{
		perror("shmctl");
		return -1;
	}
	return 0;
}

接收端rev.c代码:

#include <myhead.h>
#include "./sem.h"
#define PAGE_SIZE 4096
int main(int argc, const char *argv[])
{

	int semid = semID_get(2);
	key_t key = ftok("./",'U');
	if(key==-1)
	{
		perror("ftok");
		return -1;
	}

	int shmID = shmget(key,PAGE_SIZE,IPC_CREAT|0664);
	if(shmID==-1)
	{
		perror("shmget");
		return -1;
	}
	

	char *revbuff = shmat(shmID,NULL,0);//只读
	if(revbuff==(void *)-1)
	{
		perror("shmat");
		return -1;
	}

	while(1)
	{
		P(semid,1);//申请1号灯资源
		printf("%s\n",revbuff);
		if(strcmp("quit",revbuff)==0)
		{
			break;
		}
		V(semid,0);//释放0号灯

	}

	return 0;
}

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 sem_INFO;

	printf("请输入编号为%d信号灯的值:",SEMno);
	scanf("%d",&sem_INFO.val);
	getchar();

	if(semctl(SEMid,SEMno,SETVAL,sem_INFO)==-1)
	{
		perror("semtal");
		return -1;
	}
	return 0;
}
//申请信号灯id,初始化信号灯,返回信号灯集的id
int semID_get(int SEMcount)
{
	key_t key = ftok("./",'Y');
	if(key==-1)
	{
		perror("key");
		return -1;
	}

	int SEMid;
	if((SEMid = semget(key,SEMcount,IPC_CREAT|IPC_EXCL|0664))==-1)
	{
		if(errno==EEXIST)
		{
			SEMid = semget(key,SEMcount,IPC_CREAT|0664);//已经存在直接打开即可
			return SEMid;
		}
		perror("semget");
		return -1;
	}
	int i;
	for(i = 0;i<SEMcount;i++)
	{
		init_semno(SEMid,i);//初始化信号灯
	}
	return SEMid;
}


int P(int SEMid,int SEMno)//申请资源
{
	
	struct sembuf SEM_op;
	SEM_op.sem_num = SEMno;//要申请资源的信号灯号
	SEM_op.sem_op = -1;//申请资源
	SEM_op.sem_flg = 0;//阻塞方式申请信号灯
	
	if(semop(SEMid,&SEM_op,1)==-1)//操作的灯个数
	{
		perror("semop P");
		return -1;
	}
	return 0;
}
int V(int SEMid,int SEMno)//释放资源
{
	
	struct sembuf SEM_op;
	SEM_op.sem_num = SEMno;//要申请资源的信号灯号
	SEM_op.sem_op = 1;//释放资源
	SEM_op.sem_flg = 0;//阻塞方式申请信号灯
	
	if(semop(SEMid,&SEM_op,1)==-1)//操作的灯个数
	{
		perror("semop V");
		return -1;
	}
	return 0;
}
int DEL_sem(int SEMid)
{
	if(semctl(SEMid,0,IPC_RMID)==-1)
	{
		perror("smectl");
		return -1;
	}
	return 0;
}

sem.h代码:

#ifndef _SEM_H_

#define _SEM_H_
//申请信号等集,返回信号灯集的id
int semID_get(int semno);//semno要设置灯的个数

//申请信号灯资源(value设置为0)
int P(int semID,int semno);//参数1:信号灯id,参数2灯的个数
//释放信号灯资源(value设置为1)
int V(int semID,int semno);
//删除信号灯集
int dele_sem(int semID);

#endif

运行结果:

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

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

相关文章

书籍销售系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;书籍分类管理&#xff0c;书籍信息管理&#xff0c;订单管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;书籍信息&#xff0c;书籍资讯&#xff0…

互联网人+大模型=?

外界看互联网人和大模型的关系 是“你有这么高速运转的互联网人 搭载了大模型记住我给出的原理” 而实际上大模型的出现 让原本整齐划一说黑话的互联网人 分裂出了各种派别 朋友&#xff0c;现在是大模型乱纪元&#xff0c; 而你&#xff0c;又是哪一派呢&#xff1f; —…

【C++ Primer Plus习题】7.2

问题: 解答: #include <iostream> using namespace std;#define MAX 10int input(float* grade, int len) {int i 0;for (i 0; i < len; i){cout << "请输入第" << i 1 << "个高尔夫成绩(按0结束):";cin >> grade[i]…

【读点论文】Text detection and localization in scene images: a broad review

Text detection and localization in scene images: a broad review Abstract 如今&#xff0c;文本检测和定位在文本分析系统领域已广受欢迎&#xff0c;因为它们为大量实时应用铺平了道路&#xff0c;例如移动音译技术、视障人士辅助方法等。 文本检测和定位技术用于查找图…

过滤器和拦截器的使用和原理

1. 过滤器和拦截器 过滤器(Filter) 拦截器(Interceptor) 1.1 区别 过滤器和拦截器触发时机不一样, 过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前拦截器可以获取IOC容器中的各个bean,而过滤…

科研项目经费管理,降本增效的不二之选

国内外主流的 10 款科研项目经费管理系统对比&#xff1a;PingCode、Worktile、Colloa科研项目管理平台、云科研管理系统、智方科研管理系统、NIH Grants、NSF – National Science Foundation、IDRC、Bill & Melinda Gates Foundation、Canadian Institutes of Health Res…

媲美Flux pro! Ideogram 发布了 2.0 图像生成模型, 照片级真实感和高质量文本渲染!

Ideogram 发布了 2.0 模型,图像生成质量大幅提高&#xff0c;产品易用性改善&#xff0c;文字生成能力也提升许多。Ideogram 2.0 在图像快速对齐、照片级真实感和文本渲染质量方面取得了显著进步。人工评估一致认为 Ideogram 2.0 比 Flux Pro 和 DALLE 3 有了显著改进。尽管我们…

人工智能的可解释性(XAI) | 使用LIME

人工智能&#xff08;AI&#xff09;的广阔领域近年来经历了巨大的增长。随着每年更新、更复杂的模型问世&#xff0c;人工智能模型已经开始以无人能预测的速度超越人类智力。但是&#xff0c;随着我们得到更准确和精确的结果&#xff0c;解释这些模型所采取的复杂数学决策背后…

[翻译+笔记] 用于视频生成的Diffusion Model

这次翻译笔记的博客是https://lilianweng.github.io/posts/2021-07-11-diffusion-models/ 在阅读这篇博客前, 推荐先对Diffusion Model进行了解. 可以看我的笔记: https://blog.csdn.net/wjpwjpwjp0831/article/details/141524088 视频相关的任务向来是比图像更有挑战性, 这是…

涉密载体管控系统DW-S402|实现载体全寿命管控

为加强涉密载体使用管控&#xff0c;按照预防为主&#xff0c;强化监督&#xff0c;在满足各级保密规定前提下&#xff0c;方便涉密载体的使用和管理&#xff0c;确保涉密载体保密安全。 现有涉密载体使用过程中&#xff0c;存在手工登记台账耗工耗时、领用情况不直观、违规带…

史上最全Android UI界面设计尺寸!点击收藏

作为一名 UI 设计师&#xff0c;在进行 Android UI 设计之前&#xff0c;首先需要明确 Android 系统与 iOS 系统之间的主要区别。Android 系统是开源的&#xff0c;而 iOS 系统则是不开源的。虽然 Android 系统的开源特性对于交互设计师是有益的&#xff0c;但它也带来了一些挑…

白立新谈命运三重奏:《黑神话:悟空》中的人生思考

文 | 头部财经首席评论员白立新 发布 | 头部财经 top168.com 导语&#xff1a;《黑神话&#xff1a;悟空》中三个悟空形象演绎命运三种属性。老者悟空象征确定性&#xff0c;历经沧桑&#xff0c;蕴含世界法则&#xff1b;玩家操作悟空代表能动性&#xff0c;承载玩家意志影响…

seaborn:一个超炫的数据可视化Python库

我是东哥&#xff0c;专注于分享Python技术的自媒体人。今天&#xff0c;我将带你深入了解一个非常有趣的Python库——Seaborn。无论你是刚入门的Python小白&#xff0c;还是希望提升数据可视化技能的技术小白&#xff0c;相信这篇文章都会对你有所帮助。 项目地址&#xff1a…

数学符号-西格玛

西格玛”是希腊字母&#xff0c;也有念作“西玛”“希玛”等各种读法&#xff0c;符号是∑,英文译音是Sigma, 表示数学中的求和号&#xff0c;是数学中常用的符号&#xff0c;主要用于求多项数的和&#xff0c;用∑表示 ∑下面的小字,如i1表示从i1开始求和 上面的小字&#xf…

【网络世界】网络层

目录 &#x1f308;前言&#x1f308; &#x1f4c1; 网络层 &#x1f4c1; IPV4 &#x1f4c2; 什么是IP地址 &#x1f4c2; 网段划分 &#x1f4c2; 特殊IP &#x1f4c2; 内网和公网 &#x1f4c2; IPV4的危机 &#x1f4c1; IP协议格式 &#x1f4c1; 路由 &#x1f…

【工具篇】高效记忆方法之AnKi工具

&#x1f60a;你好&#xff0c;我是南极。正在变强的路上不断地努力着&#x1f4aa; &#x1f514;今天和大家分享一些记忆的方法&#xff0c;以及推荐了一款用于复习和巩固知识的软件AnKi。 对我们程序员而言&#xff0c;平常学习的东西会比较多&#xff0c;有时呢学的东西会…

气势向前,豪华向上 全新BMW X3长轴距版全球首发,更大体量、更高价值、更多驾趣

X家族的中流砥柱&#xff0c;豪华中型SAV的引领者现代极简主义&#xff0c;原石切割般的型面&#xff0c;塑造纯粹的BMW X辨识度“以驾驶员为中心”和“以简释繁”&#xff0c;打造“中国专属”的精致豪华空间创新不止&#xff0c;驾趣依旧&#xff0c;探索未知的忠实伙伴 &…

Django+Vue二手交易平台的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 需要的环境3.2 Django接口层3.3 实体类3.4 config.ini3.5 启动类3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质创作者&…

钉钉好用吗?类似钉钉的内部知识库有哪些?

在数字化转型的浪潮中&#xff0c;企业对于高效、便捷的知识管理工具需求日益增长。 在企业管理领域&#xff0c;虽然钉钉作为一款功能全面的企业级即时通讯与协作平台&#xff0c;以其强大的知识管理功能受到了广泛认可&#xff0c;但市场上仍有许多其他优秀的知识管理工具可…

《苍穹外卖》电商实战项目(java)知识点整理(P1~P65)【上】

史上最完整的《苍穹外卖》项目实操笔记&#xff0c;跟视频的每一P对应&#xff0c;全系列10万字&#xff0c;涵盖详细步骤与问题的解决方案。如果你操作到某一步卡壳&#xff0c;参考这篇&#xff0c;相信会带给你极大启发。 《苍穹外卖》项目实操笔记【中】&#xff1a;P66~P…