Linux 基本语句_14_信号灯实验

原理:

Send进程通过建立共享内存区域,并向其中写入数据,Recive通过与共享内存连接读取其中的数据。
但是如果进程进行读取操作的时候其他进程再次写入会产生数据丢失,产生竞态,为了确保在某段时间内只有一个操作,即读操作或者写操作,所以引入同步互斥机制,对每个信号量的操作为PV操作。

代码:

SemaphoreSend.c:

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <errno.h>
#include <sys/sem.h>
#include <string.h>

#define N 128

struct shmbuf{
	char buf[N];
};

union semun{
	int val;
};

int main(){
	key_t key;
	
	if((key = ftok(".", 'q')) < 0){ // 创建标识符 
		perror("ftok error");
		return -1;
	}
	
	int shmid;
	struct shmbuf *shm;
	
	if((shmid = shmget(key, 512, IPC_CREAT|IPC_EXCL|0664)) < 0){ // 创建一块虚拟内存 
		if(errno != EEXIST){
			perror("shmget error");
			return -1;
		}
		else{
			shmid = shmget(key, 512, 0664);
		} 
	}
	
	if((shm = shmat(shmid, NULL, 0)) > 0){ //在进程虚拟地址空间选择一块做共享内存,此区域可读可写 
		printf("shm:%p\n", shm); 
	}
	
	int semid;
	union semun semun;
	
	struct sembuf sem;
	semid  = semget(key, 2, IPC_CREAT|IPC_EXCL|0664); // 创建信号量集合,内部设置两个信号量 
	
	if(semid < 0){ // 创建错误要么有问题要么集合已经存在 
		if(errno != EEXIST){
			perror("semget error");
			return -1;
		}
		else{
			semid = semget(key, 2, 0664);
		}
	}
	else{ // 初始化信号量的值 
		semun.val = 0;
		semctl(semid, 0, SETVAL, semun); // 设置第一个信号量的值为0
		semun.val = 1;
		semctl(semid, 1, SETVAL, semun); // 设置第二个信号量的值为1 
	}
	
	while(1){
		sem.sem_num = 1;
		sem.sem_op = -1; 
		sem.sem_flg = 0;  
		semop(semid, &sem, 1); // 获取写权限 
		
		fgets(shm->buf, N, stdin); // 向控制台获取数据写入共享内存,且指针指向用户输入 
		shm->buf[strlen(shm->buf) - 1] = '\0'; // 将换行符号变成'\0'
		
		sem.sem_num = 0;
		sem.sem_op = 1;
		sem.sem_flg = 0; // 释放读权限 
		semop(semid, &sem, 1);
		
		if(strncmp(shm->buf, "quit", 4) == 0){
			shmdt(shm); // 断开虚拟内存 
			break;
		} 
	} 
	
	return 0;
}

SemaphoreRecive.c:

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <errno.h>
#include <sys/sem.h>
#include <string.h>

#define N 128

struct shmbuf{
	char buf[N];
};

union semun{
	int val;
};

int main(){
	key_t key;
	
	if((key = ftok(".", 'q')) < 0){ // 创建标识符 
		perror("ftok error");
		return -1;
	}
	
	int shmid;
	struct shmbuf *shm;
	
	if((shmid = shmget(key, 512, IPC_CREAT|IPC_EXCL|0664)) < 0){ // 创建一块虚拟内存 
		if(errno != EEXIST){
			perror("shmget error");
			return -1;
		}
		else{
			shmid = shmget(key, 512, 0664);
		} 
	}
	
	if((shm = shmat(shmid, NULL, 0)) > 0){ //在进程虚拟地址空间选择一块做共享内存,此区域可读可写 
		printf("shm:%p\n", shm); 
	}
	
	int semid;
	union semun semun;
	
	struct sembuf sem;
	semid  = semget(key, 2, IPC_CREAT|IPC_EXCL|0664); // 创建信号量集合,内部设置两个信号量 
	
	if(semid < 0){ // 创建错误要么有问题要么集合已经存在 
		if(errno != EEXIST){
			perror("semget error");
			return -1;
		}
		else{
			semid = semget(key, 2, 0664);
		}
	}
	else{ // 初始化信号量的值 
		semun.val = 0;
		semctl(semid, 0, SETVAL, semun); // 设置第一个信号量的值为0
		semun.val = 1;
		semctl(semid, 1, SETVAL, semun); // 设置第二个信号量的值为1 
	}
	
	while(1){
		sem.sem_num = 0;
		sem.sem_op = -1; 
		sem.sem_flg = 0; // 申请读权限 
		semop(semid, &sem, 1); 
		
		if(strncmp(shm->buf, "quit", 4) == 0){
			shmdt(shm); // 断开共享内存
			shmctl(shmid, IPC_RMID, NULL); // 删除共享内存断 
			semctl(semid, 0, IPC_RMID, NULL);
			semctl(semid, 1, IPC_RMID< NULL); // 删除信号量,删除信号集 
			break;
		}
		
		printf("buf:%s\n", shm->buf); 
		
		sem.sem_num = 1;
		sem.sem_op = 1;
		sem.sem_flg = 0; // 释放写权限 
		semop(semid, &sem, 1);
		
 
	} 
	
	return 0;
}

开启两个端口,分别运行Send和Recive程序

效果:

在这里插入图片描述

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

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

相关文章

Leetcode—1038.从二叉搜索树到更大和树【中等】

2023每日刷题&#xff08;四十九&#xff09; Leetcode—1038.从二叉搜索树到更大和树 算法思想 二叉搜索树的中序遍历&#xff08;左根右&#xff09;结果是一个单调递增的有序序列&#xff0c;我们反序进行中序遍历&#xff08;右根左&#xff09;&#xff0c;即可以得到一…

基于Java SSM框架实现母婴儿用品网站系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现母婴儿用品网站系统演示 摘要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 母婴用品网站&#xff0c;主要的模块包括管理员&#xff1b;主页、个人中心、用户管理、商品分…

wireshark自定义协议插件开发

目录 脚本代码 报文显示 脚本代码 local NAME "test" test_proto Proto("test", "test Protocol") task_id ProtoField.uint16("test.task_id", "test id", base.DEC) cn ProtoField.uint8("test.cn", &qu…

数学建模-数据新动能驱动中国经济增长的统计研究-基于数字产业化和产业数字化的经济贡献测度

数据新动能驱动中国经济增长的统计研究-基于数字产业化和产业数字化的经济贡献测度 整体求解过程概述(摘要) 伴随着数据要素化进程的不断加深&#xff0c;对于数据如何作用于经济发展&#xff0c;数据与其他要素结合产生的动能应该如何测度的研究愈发重要。本文将数据新动能分…

最热门超声波清洗机有哪些?热门超声波清洗机推荐

眼镜党朋友第一次接触超声波清洗机应该是在眼镜店的时候&#xff0c;把眼镜拿给老板他几分钟就搞定眼镜清洗的&#xff0c;是的没有错&#xff0c;那个机器叫超声波清洗机&#xff0c;不需要自己动手就可把眼镜清洗干净的一款智能清洁工具&#xff0c;它的出现可以说是方便了我…

计算机网络扫盲(4)——时延

一、概述 在这里&#xff0c;我们考虑分组交换网的情况&#xff0c;因特网可以被看成是一种基础设施&#xff0c;该基础设施为运行在端系统上的分布式应用提供服务。在理想情况下&#xff0c;我们希望因特网服务能够在任意两个端系统之间随心所欲地移动数据而没有任何数据地丢失…

软信天成:数据泄露日趋严重 “资产”保护何去何从

随着数据应用的逐渐深入&#xff0c;越来越多的企业意识到&#xff1a;数据作为信息的载体&#xff0c;可以成为企业知识产权、收益流和具备竞争优势的基础资产。然而&#xff0c;当包含大量敏感信息的数据被视作资产时&#xff0c;亦将直面信息被“窃取”、“泄露”和“滥用”…

CrapApi部署手册( maven+tomcat+idea)

目录 一、本章节所用到的资源共享&#xff0c;嫌麻烦的可以直接下载本地配置好运行使用二、idea maven tomcat启动&#xff0c;我的maven和tomcat的配置三、遇到的问题四、项目运行后效果图转载请标明出处&#xff0c;写作不易如果有用请给个赞~~~~~~~~~~~~~~~~~~~~~~~~~~~~~…

跨网文件摆渡系统:安全、可控的数字传输桥梁

在企业高度信息化的时代&#xff0c;数据的流通与共享已经成为企业、组织乃至个人之间不可或缺的沟通方式。然而&#xff0c;在数据流通的过程中&#xff0c;我们经常会遇到各种难题和挑战&#xff0c;尤其是当涉及到不同网络环境之间的文件传输。这不仅需要保证文件的安全性&a…

基于Java SSM框架实现人才小区公寓社区物业管理系统项目【项目源码+论文说明】

基于java的SSM框架实现人才小区公寓社区物业管理系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个人才公寓管理系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff…

MySQL练习题,学生成绩查询练习题,附带答案

题目 (一) 新建以下几个表 student(学生表)&#xff1a; snosnamesexdeptbirthagePhone 其中约束如下&#xff1a; &#xff08;1&#xff09; 学号不能存在相同的 sno int auto_increment primary key &#xff08;2&#xff09; 名字为非空 sname varchar(20) not nu…

Excel如何设置在未打印时显示虚线打印时不显示虚线

记得之前分享过一个BOM表模板&#xff0c;但是在我打印时&#xff0c;发现明明是留空白的地方却打印出来的虚线 后来&#xff0c;看了自己的页面布局&#xff0c;原来是网格线设置错误了 当我设置为查看时显示网格线&#xff0c;打印时不显示网格线&#xff0c;这样就正常了

二百一十、Hive——Flume采集的JSON数据文件写入Hive的ODS层表后字段的数据残缺

一、目的 在用Flume把Kafka的数据采集写入Hive的ODS层表的HDFS文件路径后&#xff0c;发现HDFS文件中没问题&#xff0c;但是ODS层表中字段的数据却有问题&#xff0c;字段中的JSON数据不全 二、Hive处理JSON数据方式 &#xff08;一&#xff09;将Flume采集Kafka的JSON数据…

maven篇---第二篇

系列文章目录 文章目录 系列文章目录前言一、什么是Maven的坐标?二、讲一下maven的生命周期三、说说你熟悉哪些maven命令?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的…

C# OpenVINO 模型信息查看工具

目录 效果 支持模型 项目 代码 下载 C# OpenVINO 模型信息查看工具 效果 支持模型 ONNX format (*.onnx) PDPD (*.pdmodel) TF (*.pb) TFLite (*.tflite) 项目 代码 using Sdcb.OpenVINO; using System; using System.Collections.Generic; using System.Text; using…

怎么理解回流和重绘?

回流&#xff08;reflow&#xff09;和 重绘&#xff08;repaint&#xff09;是浏览器渲染过程中的两个关键概念。 一、概念&#xff1a; 回流指的是浏览器在计算文档流布局&#xff08;layout&#xff09;时&#xff0c;重新计算元素的位置和大小的过程。当页面中的元素发生尺…

spring boot 事件机制

目录 概述实践监听spring boot ready事件代码 源码初始化流程调用流程 结束 概述 spring boot 版本为 2.7.17 。 整体看一下spring及spring boot 相关事件。 根据下文所给的源码关键处&#xff0c;打上断点&#xff0c;可以进行快速调试。降低源码阅读难度。 实践 spring…

传媒行业CRM:打造高效客户管理,提升品牌影响力

传媒行业充满竞争和变化&#xff0c;传媒企业面临着客户管理不透明、业务流程混乱、销售数据分析不足&#xff0c;无法优化营销策略和运营管理等问题。CRM系统是企业实现数智化管理的神器&#xff0c;可以有效解决这些问题。下面说说&#xff0c;传媒行业CRM系统推荐。 1、建立…

webGL开发VR和AR应用

开发 WebVR&#xff08;虚拟现实&#xff09;和 WebAR&#xff08;增强现实&#xff09; 应用需要使用 WebXR 技术&#xff0c;结合 WebGL 以实现高质量的图形渲染。以下是开发这类应用的一般技术方案&#xff0c;希望对大家有所帮助。 1.WebXR API: 使用 WebXR API&#xff0…

基于Java SSM框架+Vue实现企业公寓后勤管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架Vue实现企业宿舍后勤管理网站演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所…