IO进程线程作业day7

news2024/12/28 8:03:25

信号灯集+共享内存

自定义头文件

#ifndef SEM_H_
#define SEM_H_
//创建信号灯集,
int creat_t(int number);
//申请释放资源
int P(int semid,int semno);
//申请释放资源
int V(int semid,int semno);
//删除信号灯集
int del(int semid);
#endif

信号灯集函数集合

#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 creat_light(int semid,int i)
{
	union semun buf;
	printf("请输入要给编号为%d的灯设置的值:", i);
	scanf("%d", &buf.val);
	getchar();
	if(semctl(semid,i,SETVAL,buf) == -1)
	{
		perror("semctl error");
		return -1;
	}

	return 0;
}
int creat_t(int number)
{
	//创建信号灯集的key值
	key_t key=ftok("./",'k');
	if(key==-1)
	{
		perror("ftok error");
		return -1;
	}
	//创建信号灯集
	int semid;
	if((semid=semget(key,number,IPC_CREAT|IPC_EXCL|0664))==-1)
	{
		//对错误码进行判断,如果错误码为EEXIST,说明信号灯集已经存在
        if(errno == EEXIST)
        {
            //直接打开信号灯集即可
            semid=semget(key,number,IPC_CREAT|0664);
            return semid;
        }
		perror("semget error");
		return -1;
	}
	//定义信号灯集中灯的编号和每个灯中机构体内容
	for(int i=0;i<number;i++)
	{
		creat_light(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("P error");
        return -1;
    }

    return 0;
}
int del(int semid)
{
	if(semctl(semid,0,IPC_RMID)==-1)
	{
		perror("delete error");
		return -1;
	}
	return 0;
}

发送代码

#include <myhead.h>
#include "sem.h"
#define size 4096
int main(int argc, const char *argv[])
{
	//创建信号灯集
	int semid=creat_t(2);
	//创建共享内存的key值
	key_t key=ftok("./",'k');
		if(key==-1)
		{
			perror("ftok error");
			return -1;
		}
	//创建共享内存空间 
	int shmpid;
	if((shmpid=shmget(key,size,IPC_CREAT|0664))==-1)
	{
		perror("shmget error");
		return -1;
	}
	//映射内存到用户空间
	char *addr=shmat(shmpid,NULL,0);
	if(addr==(void*)-1)
		{
			perror("shmat error");
			return -1;
		}
	while(1)
	{
		//申请0号灯资源
		P(semid,0);
		printf("请输入:");
		fgets(addr,size,stdin);
		addr[strlen(addr)-1]='\0';
		printf("发送成功\n");
		//释放一号灯资源
		V(semid,1);
		if(strcmp(addr,"end")==0)
		{
			break;
		}

	}
	//分离共享内存
	if(shmdt(addr)==-1)
	{
		perror("shmdt error");
	}
	return 0;
}

接收代码

#include <myhead.h>
#include "sem.h"
#define size 4096
int main(int argc, const char *argv[])
{
	//创建信号灯集
	int semid=creat_t(2);
	//创建共享内存的key值
	key_t key=ftok("./",'k');
		if(key==-1)
		{
			perror("ftok error");
			return -1;
		}
	//创建共享内存空间 
	int shmpid;
	if((shmpid=shmget(key,size,IPC_CREAT|0664))==-1)
	{
		perror("shmget error");
		return -1;
	}
	//映射内存到用户空间
	char *addr=shmat(shmpid,NULL,0);
	if(addr==(void*)-1)
		{
			perror("shmat error");
			return -1;
		}
	while(1)
	{
		P(semid,1);//申请1号灯资源
		sleep(1);
		printf("收到的数据为:%s\n",addr);
		V(semid,0);//释放0号灯资源
		if(strcmp(addr,"end")==0)
		{
			break;
		}

	}
	//分离共享内存
	if(shmdt(addr)==-1)
	{
		perror("shmdt error");
	}
	//删出共享内存
	if(shmctl(shmpid,IPC_RMID,NULL)==-1)
	{
		perror("shmctl error");
		return -1;
	}
	//删除信号灯集
	del(semid);
	return 0;
}

现象展示: 

 思维导图:

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

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

相关文章

多维时序 | Matlab实现GRU-MATT门控循环单元融合多头注意力多变量时间序列预测模型

多维时序 | Matlab实现GRU-MATT门控循环单元融合多头注意力多变量时间序列预测模型 目录 多维时序 | Matlab实现GRU-MATT门控循环单元融合多头注意力多变量时间序列预测模型预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.多维时序 | Matlab实现GRU-MATT门控循环单元融…

wcf 简单实践 数据绑定 数据更新ui

1.概要 2.代码 2.1 xaml <Window x:Class"WpfApp3.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/expr…

《数据治理简易速速上手小册》第2章 数据治理框架的建立(2024 最新版)

文章目录 2.1 确立数据治理目标2.1.1 基础知识2.1.2 重点案例&#xff1a;提升零售业数据质量2.1.3 拓展案例 1&#xff1a;银行的数据安全加强2.1.4 拓展案例 2&#xff1a;医疗机构的合规性数据报告 2.2 数据治理框架的关键要素2.2.1 基础知识2.2.2 重点案例&#xff1a;制药…

VM-UNet:视觉Mamba UNet用来医学图像分割 论文及代码解读

VM-UNet 期刊分析摘要贡献方法整体框架1. Vision Mamba UNet (VM-UNet)2. VSS block3. Loss function 实验1.对比实验2.消融实验 可借鉴参考代码使用 期刊分析 期刊名&#xff1a; Arxiv 论文主页&#xff1a; VM-UNet 代码&#xff1a; Code 摘要 在医学图像分割领域&#x…

JANGOW: 1.0.1

kali:192.168.223.128 主机发现 nmap -sP 192.168.223.0/24 端口扫描 nmap -p- 192.168.223.154 开启了21 80端口 web看一下&#xff0c;有个busque.php参数是buscar,但是不知道输入什么&#xff0c;尝试文件包含失败 扫描目录 dirsearch -u http://192.168.223.154 dirse…

mysql 分表实战

本文主要介绍基于range分区的相关 1、业务需求&#xff0c;每日160w数据&#xff0c;每月2000w;解决大表数据读写性能问题。 2、数据库mysql 8.0.34&#xff0c;默认innerDB;mysql自带的逻辑分表 3、分表的目的:解决大表性能差&#xff0c;小表缩小查询单位的特点(其实优化的精…

人事|人事管理系统|基于Springboot的人事管理系统设计与实现(源码+数据库+文档)

人事管理系统目录 目录 基于Springboot的人事管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员登录 2、员工管理 3、公告信息管理 4、公告类型管理 5、培训管理 6、培训类型管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、…

2024年环境安全科学、材料工程与制造国际学术会议(ESSMEM2024)

【EI检索】2024年环境安全科学、材料工程与制造国际学术会议&#xff08;ESSMEM2024) 会议简介 我们很高兴邀请您参加将在三亚举行的2024年环境安全科学、材料工程和制造国际学术会议&#xff08;ESSMEM 2024&#xff09;。 ESSMEM2024将汇集世界各国和地区的研究人员&…

CrackRTF1

由此可知为六位密码且<100000自动退出 发现是哈希加密&#xff0c;经过网上查找后了解到 0x8004u 为 SHA1 加密&#xff0c;故从网上寻找脚本并进行爆破 密码为123321 找到一个取巧的网站 MD5免费在线解密破解_MD5在线加密-SOMD5 Flag{N0_M0re_Free_Bugs}

Mysql索引讲解及创建

索引介绍 1.什么是索引&#xff1f; 索引是存储引擎中一种数据结构&#xff0c;或者说数据的组织方式&#xff0c;又称之为键key&#xff0c;是存储引擎用于快速找到记录的 一种数据结构。 为数据建立索引就好比是为书建目录&#xff0c;或者说是为字典创建音序表&#xff0c;…

视频号视频下载教程:如何把微信视频号的视频下载下来

视频号下载相信不少人都多少有一些了解&#xff0c;但今天我们就来细说一下关于视频号视频下载的相关疑问&#xff0c;以及大家经常会问到底如何把微信视频号的视频下载下来&#xff1f; 视频号视频下载教程 视频号链接提取器详细使用指南&#xff0c;教你轻松下载号视频&…

LabVIEW燃料电池船舶电力推进监控系统

LabVIEW燃料电池船舶电力推进监控系统 随着全球经济一体化的推进&#xff0c;航运业的发展显得尤为重要&#xff0c;大约80%的世界贸易依靠海上运输实现。传统的船舶推进系统主要依赖于柴油机&#xff0c;这不仅耗能高&#xff0c;而且排放严重&#xff0c;对资源和环境的影响…

uniapp播放mp4省流方案

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

Antd 嵌套子表格 defaultExpandAllRows 默认展开不生效

问题描述 在使用 antd 嵌套子表格时&#xff0c;想要默认展开所有子列表&#xff0c;设置属性:defaultExpandAllRows“true”&#xff0c;但是子列表没有展开 原因分析 defaultExpandAllRows 属性官网定义&#xff1a; 从官网定义可知&#xff0c;defaultExpandAllRows 属性…

P2680 [NOIP2015 提高组] 运输计划 第一个测试点信息 || 被卡常,链式前向星应该解决的是vector的push_back频繁扩容的耗时

[NOIP2015 提高组] 运输计划 - 洛谷 目录 测试点信息 P2680_1.in P2680_1.out 图&#xff1a; 50分参考代码&#xff08;开了n^2的数组&#xff0c;MLE了&#xff09;&#xff1a; 测试点信息 Subtask #0 #1 P2680_1.in 100 1 7 97 4 89 2 0 40 91 1 70 84 1 36 92 3 …

ASLR 和 PIE

前言 ASLR&#xff08;Address Space Layout Randomization&#xff0c;地址空间随机化&#xff09;是一种内存攻击缓解技术&#xff0c;是一种操作系统用来抵御缓冲区溢出攻击的内存保护机制。这种技术使得系统上运行的进程的内存地址无法被预测&#xff0c;使得与这些进程有…

Spring Cloud学习

1、什么是SpringCloud Spring cloud 流应用程序启动器是基于 Spring Boot 的 Spring 集成应用程序&#xff0c;提供与外部系统的集成。Spring cloud Task&#xff0c;一个生命周期短暂的微服务框架&#xff0c;用于快速构建执行有限数据处理的应用程序。Spring cloud 流应用程…

【Java设计模式】二、单例模式

文章目录 1、懒汉式2、双重检查3、静态内部类4、饿汉式5、枚举6、单例模式的破坏&#xff1a;序列化和反序列化7、单例模式的破坏&#xff1a;反射 单例模式即在程序中想要保持一个实例对象&#xff0c;让某个类只有一个实例单例类必须自己创建自己唯一的实例&#xff0c;并对外…

mysql的增删改查(常用)

增(insert) 语法&#xff1a; insert into 表名&#xff08;字段&#xff09; values( 字段对应的值) 案例&#xff1a; 创建一个学生表 结构如下&#xff1a; create table student(id int ,name varchar(20),age int); 向表中插入2条数据 create table student(id int ,n…

802.11局域网的 MAC 层协议、CSMA/CA

目录 802.11 局域网的 MAC 层协议 1 CSMA/CA 协议 无线局域网不能使用 CSMA/CD 无线局域网可以使用 CSMA 协议 802.11 的 MAC 层 分布协调功能 DCF 点协调功能 PCF CSMA/CA 协议的要点 2 时间间隔 DIFS 的重要性 SIFS DIFS 3 争用信道的过程 时隙长度的确定 退避…