IO进程线程 day8

使用信号量灯集同步三个进程操作共享内存打印ABC

head.h

#ifndef __SEM_H__
#define __SEM_H__//创建信号灯集并初始化
int create_sem(int semcount);//申请资源 P操作
int P(int semid,int semno);//释放资源 V操作
int V(int semid,int semno);//删除信号灯集
int delete_sem(int semid);#endif

test.c

#include<my_head.h>
union semun
{int   val;   struct semid_ds *buf;      unsigned short  *array;     struct seminfo  *__buf;  
};//初始化信号灯集函数
int init_sem(int semid,int semno)
{union semun us;printf("请输入第%d号灯的初始值:",semno);scanf("%d",&us.val);getchar();if(semctl(semid,semno,SETVAL,us) == -1){perror("init_sem error");return -1;}return 0;
}//创建信号灯集并初始化 
int create_sem(int semcount)
{key_t key = ftok("/",520);if(key == -1){perror("ftok error");return -1;}int semid = semget(key,semcount,IPC_CREAT|IPC_EXCL|0666);if(semid == -1){if(errno == EEXIST){semid = semget(key,semcount,IPC_CREAT);return semid;}perror("semget error");return -1;}for(int i=0;i<semcount;i++){init_sem(semid,i);}return semid;
}//申请资源 P操作
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;
}//释放资源 V操作
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 delete_sem(int semid)
{if(semctl(semid,0,IPC_RMID) == -1){perror("delete_sem error");return -1;}return 0;
}

A.c

#include<my_head.h>
#define PAGE_SIZE 4096
#include "head.h"int main(int argc, const char *argv[])
{//创建信号灯集并初始化int semid = create_sem(3);//创建key值key_t key = ftok("/",1314);if(key == -1){perror("ftok");return -1;}//用key值创建一个共享内存,返回shmidint shmid = shmget(key,PAGE_SIZE,IPC_CREAT|0666);if(shmid == -1){perror("shmget error");return -1;}//映射共享内存到用户空间char *addr = shmat(shmid,NULL,0);if(addr == (void *)-1){perror("shmat error");return -1;}//使用共享内存int count = 5;while(count -- ){//先打印一个Aputs("A");//p操作申请0号灯P(semid,0);//存放数据Bstrcpy(addr,"B");//v操作释放1号灯V(semid,1);}//取消共享内存映射if(shmdt(addr) == -1){perror("shmdt error");return -1;}return 0;
}

B.c

#include<my_head.h>
#define PAGE_SIZE 4096
#include "head.h"int main(int argc, const char *argv[])
{//创建信号灯集并初始化int semid = create_sem(3);//创建key值key_t key = ftok("/",1314);if(key == -1){perror("ftok");return -1;}//用key值创建一个共享内存,返回shmidint shmid = shmget(key,PAGE_SIZE,IPC_CREAT|0666);if(shmid == -1){perror("shmget error");return -1;}//映射共享内存到用户空间char *addr = shmat(shmid,NULL,0);if(addr == (void *)-1){perror("shmat error");return -1;}//使用共享内存int count = 5;while(count -- ){//p操作申请1号灯P(semid,1);//打印数据Bprintf("%s\n",addr);strcpy(addr,"C");//v操作释放2号灯V(semid,2);}//取消共享内存映射if(shmdt(addr) == -1){perror("shmdt error");return -1;}return 0;
}

C.c

#include<my_head.h>
#define PAGE_SIZE 4096
#include "head.h"int main(int argc, const char *argv[])
{//创建信号灯集并初始化int semid = create_sem(3);//创建key值key_t key = ftok("/",1314);if(key == -1){perror("ftok");return -1;}//用key值创建一个共享内存,返回shmidint shmid = shmget(key,PAGE_SIZE,IPC_CREAT|0666);if(shmid == -1){perror("shmget error");return -1;}//映射共享内存到用户空间char *addr = shmat(shmid,NULL,0);if(addr == (void *)-1){perror("shmat error");return -1;}//使用共享内存int count = 5;while(count -- ){//p操作申请2号灯P(semid,2);//打印数据Cprintf("%s\n",addr);//存放数据Bstrcpy(addr,"C");//v操作释放0号灯V(semid,0);}//取消共享内存映射if(shmdt(addr) == -1){perror("shmdt error");return -1;}//删除共享内存if(shmctl(shmid,IPC_RMID,NULL) == -1){perror("shmctl error");return -1;}//删除信号灯集delete_sem(semid);return 0;
}

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

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

相关文章

CT检测中的CT是什么意思,可以用来哪些检测,如何成像的。

问题描述&#xff1a;CT检测中的CT是什么意思&#xff0c;可以用来哪些检测&#xff0c;如何成像的。 问题解答&#xff1a; CT是Computed Tomography的缩写&#xff0c;中文称为电子计算机断层扫描。CT是一种利用X线束、γ射线、超声波等对人体某一部位进行连续的断面扫描&a…

【博士每天一篇文-算法】Graph Structure of Neural Networks

阅读时间&#xff1a;2023-11-12 1 介绍 年份&#xff1a;2020 作者&#xff1a;尤家轩 斯坦福大学 期刊&#xff1a; International Conference on Machine Learning. 引用量&#xff1a;130 论文探讨了神经网络的图结构与其预测性能之间的关系。作者提出了一种新的基于图的…

Java基础 |数组排序

Java基础课| 数组排序 冒泡排序直接选择排序反转排序 冒泡排序 他排序数组的过程中总将较小的数往前排&#xff0c;较大的数往后放&#xff0c;类似水中气泡往上升的动作&#xff0c;所以叫冒泡排序。 基本思想是对比相邻的元素值&#xff0c;如果满足条件就交换元素值&#x…

2024-01-01 K 次取反后最大化的数组和和加油站以及根据身高重建队列

1005. K 次取反后最大化的数组和 思路&#xff1a;每一次取反最小值即可&#xff01;贪心的思路就是先排序&#xff0c;反转负数的值&#xff0c;后在贪心反转最小值 class Solution:def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:count 0while …

Unity中URP下开启和使用深度图

文章目录 前言一、在Unity中打开URP下的深度图二、在Shader中开启深度图1、使用不透明渲染队列才可以使用深度图2、半透明渲染队列深度图就会关闭 三、URP深度图 和 BRP深度图的区别四、在Shader中&#xff0c;使用深度图1、定义纹理和采样器2、在片元着色器对深度图采样并且输…

LeetCode刷题--- 最小路径和

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述动…

setup 语法糖

只有vue3.2以上版本可以使用 优点&#xff1a; 更少的样板内容&#xff0c;更简洁的代码 能够使用纯 Typescript 声明props 和抛出事件 更好的运行时性能 更好的IDE类型推断性能 在sciprt标识上加上setup 顶层绑定都可以使用 不需要return &#xff0c;可以直接使用 使用组件…

Redis异步写失败后补数逻辑设计

背景 最近各种机房事故频发&#xff0c;所以很多公司都对Redis存储等进行异步多活&#xff0c;我们公司采用的方式是通过客户端双写的方式来实现异地Redis机房的备份&#xff0c;但是当异地机房出现临时网络故障时&#xff0c;就涉及到了如何进行补数的操作&#xff0c;本文就…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机图像转换由Mono10转换为Mono8(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机图像转换由Mono10转换为Mono8&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机的Mono10转换为Mono8图的技术背景在NEOAPI SDK里实现相机图像由Mono10转换为Mono8格式 工业相机通过NEOAPI SDK实现相机图像转换的优…

【大麦小米学量化】升级pywencai解决同花顺问财接口访问问题实现智能选股(小白避坑指南)

文章目录 前言一、pywencai 怎么了&#xff1f;二、解决办法三、智能选股代码&#xff08;缺环境的&#xff0c;请看开头文章推荐的博文&#xff09;总结 前言 前面撰文&#xff1a;【大麦小米学量化】通过pywencai访问同花顺问财接口实现智能选股 很多小伙伴应该已经用得很六…

理解Herbrand Equivalence

笔者最近在看GVN的一系列论文&#xff0c;总会看到一个概念叫Herbran Equivalence&#xff0c;依靠这种定义&#xff0c;能够判断一个GVN算法是否是complete的&#xff0c;也即检测一个算法是否是precise的&#xff0c;只有找到所有Herbrand Equivalence关系的算法才能称得上是…

Ddos攻击防御之使用nginx

Ddos 攻击是最常见的web攻击了,原理非常简单,用自己的电脑模拟大量用户发送大量请求,apache 的 ab 压力测试工具就可以做到这一点,如果我这样做,而对方的服务器配置没有我电脑好,那么一会之后,对方的服务器就难以响应其他用户的请求,如果我控制了大量肉鸡并使用这些肉鸡…

2024.1.10

完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&#xf…

01-你好Python-python环境安装 python解释器的安装 pycharm的安装

python环境安装 官方网址&#xff1a;https://python.org 这里可以下载最新版本的&#xff0c;下载完成以后在自己的浏览器文件下载的文件夹中找到该文件 下载速度可能会比较慢&#xff0c;这里已经提供好了文件&#xff0c;可以直接点击安装 点击Customize installation 点击…

2. Spring Boot 自动配置 Mybatis 流程

1. Spring Boot 自动配置 Mybatis 自动配置过程中做了3个主要bean的创建及很重要的一些事情。 sqlSessionFactory、sqlSessionTemplate、MapperScannerConfigurer 等配置bean的创建。sqlSessionFactory&#xff1a;解析 xml配置文件&#xff0c;并将MappedStatement放入到Has…

Mybatis之基本操作

目录 一、Mybatis中的增删改操作1、单个insert2、单个delete3、批量select4、单个update 二、数据输入1、单个简单的类型2、实体类类型参数3、零散的简单类型数据4、Map参数的数据类型①使用场景②对应关系 三、数据输出1、返回单个简单类型数据2、返回实体类对象3、返回Map类型…

pulsar的架构与特性记录

一、什么是云原生 云原生的概念是2013年Matt Stine提出的,到目前为止&#xff0c;云原生的概念发生了多次变更&#xff0c;目前最新对云原生定义为: Devps持续交付微服务容器 而符合云原生架构的应用程序是: 采用开源堆栈(K8SDocker)进行容器化&#xff0c;基于微服务架构提高灵…

人工智能利用深度学习技术增强高级驾驶辅助系统(ADAS)

深度学习通过实时传感器数据增强高级驾驶辅助系统(ADAS)&#xff0c;实现精确的物体检测、碰撞预测和主动决策。 人工智能和机器学习利用深度学习技术的优势&#xff0c;使高级驾驶辅助系统(ADAS)发生了重大变革。ADAS在很大程度上依赖深度学习来分析和解释从各种传感器获得的…

Flutter 中使用 ICON

Flutter Icon URL &#xff1a; https://fonts.google.com/icons&#xff1a; 在Flutter中使用 Icon 步骤如下&#xff1a; 导入图标库 在Dart 文件中导入 material.dart 包&#xff0c;该包包含了 Flutter 的图标库。 import package:flutter/material.dart;使用图标组件 …

解决Vue.js not detected的问题

"Vue.js not detected"通常是由于Vue Devtools无法检测到你的Vue.js应用程序而引起的。这个问题可能有几种原因&#xff0c;下面是一些建议的解决方法&#xff1a; 1. **安装Vue Devtools浏览器插件:** - 确保你已经安装了Vue Devtools浏览器插件。你可以在Chrom…