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

思维导图:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

校园微社区微信小程序源码/二手交易/兼职交友微信小程序源码

云开发校园微社区微信小程序开源源码&#xff0c;这是一款云开发校园微社区-二手交易_兼职_交友_项目微信小程序开源源码&#xff0c;可以给你提供快捷方便的校园生活&#xff0c;有很多有趣实用的板块和功能&#xff0c;如&#xff1a;闲置交易、表白交友、疑问互答、任务兼职…

读书笔记之《没有工作的世界》:AI是否会取代人类?

《没有工作的世界—如何应对科技性失业与财富不平等》作者是 [英]丹尼尔苏斯金德&#xff0c; 原作名: A WORLD WITHOUT WORK&#xff1a;Technology,Automation,and How We Should Respond 丹尼尔苏斯金德&#xff08;Daniel Susskind &#xff09;&#xff1a;曾任英国首相战…

jvm面试题目补充

jdk&jre Java程序设计语言、Java虚拟机、Java API类库这三部分统称为JDK&#xff08;Java Development Kit&#xff09;。 把Java API类库中的Java SE API子集 [1] 和Java虚拟机这两部分统称为JRE&#xff08;Java Runtime Environment&#xff09;&#xff0c;JRE是支持…

python学习笔记 - 标准库函数

概述 为了方便程序员快速编写Python脚本程序&#xff0c;Python提供了很多好用的功能模块&#xff0c;它们内置于Python系统&#xff0c;也称为内置函数(Built-in Functions&#xff0c;BlF)&#xff0c;Python 内置函数是 Python 解释器提供的一组函数&#xff0c;无需额外导…

网络层的DDoS攻击与应用层的DDoS攻击之间的区别

DDoS攻击&#xff08;即“分布是拒绝服务攻击”&#xff09;&#xff0c;是基于DoS的特殊形式的拒绝服务攻击&#xff0c;是一种分布式、协作的大规模攻击方式&#xff0c;主要瞄准一些企业或政府部门的网站发起攻击。根据攻击原理和方式的区别&#xff0c;可以把DDoS攻击分为两…

“一代传奇”宗庆后谢幕,500亿元饮料帝国迎交棒时刻

宗庆后同志逝世 2月25日&#xff0c;娃哈哈集团发布讣告&#xff0c;娃哈哈创始人、董事长宗庆后同志&#xff0c;因病医治无效&#xff0c;于 2024-02-25 10:30 逝世&#xff0c;享年 79 岁。 这是一位伟大的企业家。 伟大的地方不仅仅在于&#xff0c;宗庆后 42 岁开始白手起…

【网站项目】437物流管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Python字符串访问与拼接你搞懂了吗?

使用下标访问字符串&#xff0c;从0开始计数&#xff0c;-1表示最后一个字符。三种遍历字符串的方法&#xff1a;for循环、len()和enumerate()。字符串拼接只能是字符串之间使用&#xff0c;不能与数字拼接。 1.下标访问字符串 通过下标访问字符串的内容&#xff0c;下标从 0 …

蛋白结构预测模型评价指标

欢迎浏览我的CSND博客&#xff01; Blockbuater_drug …点击进入 文章目录 前言一、蛋白结构预测模型评价指标TM-scorelDDT 二、Alphafold中的评价指标pLDDTpTMPAE 三、AlphaFold-multimer 蛋白结构的评价指标DockQipTM 总结参考资料 前言 本文汇总了AlphaFold和AlphaFold-mul…

C语言函数递归

一、什么是递归 递归实际上就是函数自己调用自己。 递归在书写的时候&#xff0c;有2个必要条件&#xff1a; • 递归存在限制条件&#xff0c;当满足这个限制条件的时候&#xff0c;递归便不再继续。 • 每次递归调用之后越来越接近这个限制条件。 在下面的例子中&#xff0…

将一个 PostgreSQL 数据库复制到另一个数据库中

以管理员身份进入cmd窗口&#xff0c;输入如下命令 语法&#xff1a; pg_dump -C -h 本机IP -U 本机postgresql用户名 源数据库名 | psql -h 服务器IP -U 服务器postgresql用户名 目标数据库名 示例&#xff1a; pg_dump -C -h 127.0.0.1 -U postgres test01-dbname | psql…

leetcode:1925. 统计平方和三元组的数目(python3解法)

难度&#xff1a;简单 一个 平方和三元组 (a,b,c) 指的是满足 a2 b2 c2 的 整数 三元组 a&#xff0c;b 和 c 。 给你一个整数 n &#xff0c;请你返回满足 1 < a, b, c < n 的 平方和三元组 的数目。 示例 1&#xff1a; 输入&#xff1a;n 5 输出&#xff1a;2 解释…

AI绘画丨精美3D立体插图

利用衍纸艺术制作的3D立体精美插图&#xff0c;以星星作为主题&#xff0c;错落在整个画面中&#xff0c;一起看看他的生成关键词吧~ 使用关键词&#xff1a;A gorgeous multi-dimensional paper illustration, paper quilling, 3D diorama of a vintage stargazing illustrat…

JSON:简介与基本使用

目录 什么是JSON&#xff1f; JSON的基本结构 JSON的基本使用 在JavaScript中使用JSON 创建JSON对象 解析JSON字符串 生成JSON字符串 在其他编程语言中使用JSON 总结 什么是JSON&#xff1f; JSON&#xff0c;全称为JavaScript Object Notation&#xff0c;是一种轻量…

NCDA视觉传达设计大赛终极攻略:助你斩获佳绩

第十二届全国高校未来设计师数字艺术设计大赛&#xff08;NCDA&#xff09; A类&#xff1a;视觉传达设计 参赛对象&#xff1a; 大学生小组&#xff1a;分①研究生组②本科生组③专科生组&#xff0c;三组分别进行评审 教师小组&#xff1a;普通高校教师&#xff0c;不分小…

解除网页复制限制

chrome 中右击点检查&#xff0c; 找到要复制的文字块 把如图所示右边的 copy里的事件全部remove 然后就可以右击复制了

043 多态

示例 public class A {public void say(){System.out.println("I am A");} } public class B extends A {Overridepublic void say(){System.out.println("I am B");} } public class Test {public static void main(String[] args) {A a new B(); // …

项目管理基本要素--项目、项目集、项目组合

本文描述从事项目管理和了解项目管理领域所需的基本要素&#xff0c;词汇定义来自于《项目知识管理体系》(PMBOK指南)第六版&#xff0c;仅作个人学习使用&#xff0c;任何对此文章的引用&#xff0c;应当说明源出处&#xff0c;不得用于商业用途。 如有侵权、联系速删 文章目录…

项目管理工具git

git 1. git介绍1.1. 版本控制系统 2. 创建本地版本库2.1 概念2.2 操作步骤 3. 修改文件4. 练习: 添加一个本地项目到仓库5. 添加远程仓库5.1 添加远程仓库5.2 本地仓库同步到远程仓库5.3 克隆远程仓库到本地5.4 SSH设置 6. 分支管理6.1 创建分支6.2 切换分支6.3 合并分支6.4 解…

猫头虎分享已解决Bug || ValueError: No gradients provided for any variable

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …