io+day8

 

 #ifndef __SEM
  2 #define __SEM
  3 
  4 //声明一个创>
  5 int init_sem(
  6 
  7 //声明一个p操
  8 int P(int sem
  9 
 10 //声明一个v操
 11 int W(int sem
 12 
 13 //声明一个删>
 14 int del_sem(i
 15 
 16 #endif
1 #include <myhead.h>                                                                                                                           
  2 union semun {
  3     int              val;    /* Value for SETVAL */
  4     struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
  5     unsigned short  *array;  /* Array for GETALL, SETALL */
  6     struct seminfo  *__buf;  /* Buffer for IPC_INFO
  7                     (Linux-specific) */
  8 };
  9 //信号灯集里每个信号灯的初始化
 10 int sem_value(int semid,int semno,int semvalue)
 11 {
 12     union semun us;
 13     us.val=semvalue;
 14     if(semctl(semid,semno,SETVAL,us)==-1)
 15     {
 16         perror("semctr");
 17         return -1;
 18     }
 19     return 0;
 20 }
 21 //创建信号灯集并初始化函数
 22 int init_sem(int semnum)
 23 {
 24     //1.创建一个key钥匙
 25     key_t key;
 26     if((key=ftok("/",'t'))==-1)
 27     {
 28         perror("ftok");
 29         return -1;
 30     }
 31     //2.创建一个信号灯集
 32     int semid;
 33     if((semid=semget(key,semnum,IPC_CREAT|IPC_EXCL|0664))==-1)
 34     {
 35         if(errno==EEXIST)
 36         {
 37             //防止多进程同时调用时多次初始化
 38             semid=semget(key,semnum,IPC_CREAT|0664);
 39             return semid;
 40         }
 41         perror("semget");
 42         return -1;
 43     }
 44     //3.信号灯集初始化
 45     for(int i=0;i<semnum;i++)
 46     {
 47         if(i==0)
 48         {
 49             //参数1:id
 50             //参数2:初始化的信号灯编号
 51             //参数3:初始化的信号灯的value值
 52             sem_value(semid,i,1);
 53         }
 54         else
 55         {
 56             sem_value(semid,i,0);
 57         }
 58     }
 59     return semid;
 60 }
 61 
 62 //p操作函数
 63 int P(int semid,int semno)
 64 {
 65     struct sembuf buf;
 66     buf.sem_num=semno;//灯集里灯编号
 67     buf.sem_op=1;  //释放资源
 68     buf.sem_flg=0; //阻塞
 69     if(semop(semid,&buf,1)==-1)
 70     {
 71         perror("semop");
 72         return -1;
 73     }
 74     return 0;
 75 
 76 }
 77 //w操作函数
 78 int W(int semid,int semno)
 79 {
 80         struct sembuf buf;
 81         buf.sem_num=semno;//灯集里灯编号
 82         buf.sem_op=-1;  //申请资源
 83         buf.sem_flg=0; //阻塞
 84         if(semop(semid,&buf,1)==-1)
 85         {
 86                 perror("semop");
 87                 return -1;
 88         }
 89         return 0;
 90 }
 91 
 92 //删除信号灯的函数
 93 int del_sem(int semid)
 94 {
 95     if(semctl(semid,0,IPC_RMID,0)==-1)
 96     {
 97         perror("semctl");
 98         return -1;
 99     }
100     return 0;
101 }
1 #include <myhead.h>
  2 #include "sem.h"
  3 int main(int argc, const char *argv[])
  4 {
  5     //创建钥匙
  6     key_t key=-1;
  7     if((key=ftok("/",'c'))==-1)
  8     {
  9         perror("ftok");
 10         return -1;
 11     }
 12     //创建共享享内存
 13     int shmid;                                 
 14     if((shmid=shmget(key,4096,IPC_CREAT|0664))=
 15     {
 16         perror("shmget");
 17         return -1;
 18     }   
 19     //映射到用户空间
 20     char *adder;
 21     if((adder=shmat(shmid,NULL,0))==(void *)-1)
 22     {
 23         perror("shmat");
 24         return -1;
 25     }   
 26     //创建一个信号灯集
 27     int semid;
 28     semid=init_sem(4);
 29     //创建父子进程
 30     pid_t pid;
 31     pid=fork();
 32     if(pid<0)
 33     {   
 34         perror("fork");
 35         return -1;
 36     }   
 37     else if(pid>0)
 38     {   
 39         //父进程
 40         while(1)
 41         {
 42             //等待0信号资源
 43             W(semid,0);
 44             fgets(adder,4096,stdin);
 45             adder[strlen(adder)-1]='\0';
 46             //释放1信号资源
 47             P(semid,1);
 48             if(strcmp(adder,"quit")==0)
 49             {
 50                 break;
 51             }   
 52         }
 53         wait(NULL);
 54     }   
 55     else    
 56     {   
 57         //子进程
 58         while(1)
 59         {   
 60             //等待3信号资源
 61             W(semid,3);
 62             //房子里面拿东西
 63             printf("共享内存数据:%s\n",adder);
 64                     //释放2信号资源
 65                     P(semid,2);
 66             if(strcmp(adder,"quit")==0)
 67             {
 68                 break;
 69             }   
 70         }   
 71         exit(EXIT_SUCCESS);
 72     }   
 73     //取消链接
 74     shmdt(adder);
 75     return 0;
 76 }

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

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

相关文章

【博客系统】 二

本文主要介绍了linux和如何在云服务器上部署一个简单的servlet程序. 一.云服务器 真正搞一个网站,是希望这个网站被其他人访问到 , 所以需要一个云服务器(具有外网ip)来让别人也可以访问 云服务器 操作系统是Linux(一般都是通过命令行来操作) 当前市面上常见的系统: 1.windo…

IDEA写mybatis程序,java.io.IOException:Could not find resource mybatis-config.xml

找不到mybatis-config.xml 尝试maven idea:module&#xff0c;不是模块构造问题 尝试检验pom.xml&#xff0c;在编译模块添加了解析resources内容依旧不行 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.or…

魔众文库系统 v5.6.0 DWG文件格式支持,部分数据封面显示异常,定时调度清理临时文件

魔众文库系统基于文档系统知识&#xff0c;建立平台与领域&#xff0c;打造流量、用户、付费和变现的闭环&#xff0c;帮助您更好的搭建文库系统。 魔众文库系统发布v5.6.0版本&#xff0c;新功能和Bug修复累计17项&#xff0c;DWG文件格式支持&#xff0c;部分数据封面显示异…

P95陷阱

想象这个场景&#xff1a; 一位测试同事走到你的座位旁&#xff0c;说&#xff1a;“接到客户&#xff08;上游系统&#xff09;反馈&#xff0c;说我们系统有个Rest接口响应慢。我看了监控上的P95响应时间&#xff0c;都一秒多了&#xff0c;帮忙看看吧。” 又来活了。 你喜…

langchain 之 Tools 多案例使用(一)

原文&#xff1a;langchain 之 Tools 多案例使用&#xff08;一&#xff09; - 简书 ATTENTION: 如果采用 openai 的接口&#xff0c;需要走代理&#xff0c;本文采用 proxychains 进行设置。开启 debug 模式后&#xff0c;能看到更多的输出信息。 import langchain langcha…

ROC 曲线:健康背景下的应用和解释

一、介绍 在医疗保健领域&#xff0c;做出明智的决策对于改善患者治疗结果、有效分配资源和设计有效的诊断测试至关重要。受试者工作特征 (ROC) 曲线是一个强大的工具&#xff0c;在评估诊断测试的性能、区分健康个体和患病个体以及优化医疗保健干预方面发挥着至关重要的作用。…

第07章 面向对象编程(进阶)

一 关键字&#xff1a;this 1.1 this是什么&#xff1f; 在Java中&#xff0c;this关键字不算难理解&#xff0c;它的作用和其词义很接近。 它在方法&#xff08;准确的说是实例方法或非static的方法&#xff09;内部使用&#xff0c;表示调用该方法的对象。它在构造器内部使…

【android】install android NDK

目录 1 下载NDK 2 解压 3 android-ndk的配置 1 下载NDK 下载网址&#xff1a;NDK 下载 | Android NDK | Android Developers 如果没有所需要的版本&#xff0c;则点击页面下面 不受支持的 NDK 下载需要的版本。 2 解压 将压缩文件&#xff08;例如 android-ndk-r25c-…

(五)什么是Vite——冷启动时vite做了什么(依赖、预构建)

vite分享ppt&#xff0c;感兴趣的可以下载&#xff1a; ​​​​​​​Vite分享、原理介绍ppt 什么是vite系列目录&#xff1a; &#xff08;一&#xff09;什么是Vite——vite介绍与使用-CSDN博客 &#xff08;二&#xff09;什么是Vite——Vite 和 Webpack 区别&#xff0…

一看就会的jni,不会你来打我!

环境配置 Android Studio&#xff0c;这个不多说了。 简单说一下NDK的下载和环境变量&#xff0c;方便在Terminal里使用命令(mac版)。 下载 1.可以通过Android Studio内置的Settings-Android SDK-SDK Tools安装NDK&#xff0c;下载目录为 /Users/mac-xxx(Username)/Library…

VF01 bapi BAPI_BILLINGDOC_CREATEMULTIPLE修改付款方

系统标准通过函数SD_PARTNER_READ&#xff0c;读取VBPA表销售订单对应的伙伴。 调整通过源代码增强LV60AA01最后位置。

《QT从基础到进阶·二十九》QT,opencv源码调试

有时候我们在使用VS调试程序的bug&#xff0c;但发现程序崩溃的地方并不在我们写的程序中&#xff0c;我们通过调用堆栈发现程序崩溃的地方出现在QT或者opencv等源码中&#xff0c;那么我们怎么能把断点打到这些开源库中&#xff0c;下面提供一种办法&#xff1a; 解决方案–右…

单日充值破6000万、8天收入破亿,小程序短剧的商业真相

进入2023年以来&#xff0c;短剧发展的速度相当惊人。无论是从短视频平台的用户规模来说&#xff0c;还是从短剧内容的商业效益来看&#xff0c;都进入了双增长的狂飙模式。 小程序指的是在一些APP的小程序平台上&#xff08;多为微信端&#xff0c;抖音、快手等平台也有&…

使用requests库解决Session对象设置超时的问题

在requests库的IRC频道中&#xff0c;提出了一个问题&#xff0c;即Session对象在requests库中没有一个可以全局设置的timeout属性&#xff0c;而是需要为每个请求传递timeout值&#xff0c;或者创建一个自定义子类来实现。 为了解决这个问题&#xff0c;可以向Session对象添加…

Apache阿帕奇安装配置

目录 一、下载程序 1. 点击Download 2. 点击Files for Microsoft Windows 3. 点击Apache Lounge 4. 点击httpd-2.4.54-win64-VSI6.zip ​编辑​ 5. 下载压缩包 6.解压到文件夹里 二、配置环境变量 1. 右键我的电脑 - 属性 2. 高级系统设置 3. 点击环境变量 4. 点击系统…

中国芯片金字塔成形,商业化拐点将至

其作始也简&#xff0c;其将毕也钜。 传说埃及用时30年建成左赛尔金字塔&#xff0c;成为亘古不灭的世界奇迹。在今天&#xff0c;中国芯片产业走过8年“国产替代”历程&#xff0c;国产芯片的“金字塔”体系业已初具雏形&#xff0c;展现出蓬勃的发展潜力。 2023年是补全自主…

Linux系统进程与进程间通信

Linux是一个多用户、多任务的操作系统&#xff0c;支持多个进程同时运行。进程是Linux系统中的基本单元&#xff0c;它们负责执行各种任务&#xff0c;如网页浏览、文件下载、程序运行等。在Linux中&#xff0c;进程是由一个或多个线程组成的&#xff0c;线程是进程的基本执行单…

浅谈安科瑞无线测温产品在巴西某工厂的应用

摘 要&#xff1a;高压开关设备是变电站和配电站中保证电力系统安全运行的重要设备之一,因此,开关柜的稳定运行对于整个电力系统有非常重要的意义。设备老化、长期高负荷运行都可能使设备局部温度过高而发生火灾&#xff0c;因此,对变电站内的敏感设备进行温度检测变得尤为重要…

Java实现简单的俄罗斯方块游戏

一、创建新项目 1.首先新建一个项目&#xff0c;并命名为俄罗斯方块。 2.其次新建一个类&#xff0c;命名为Main&#xff0c;或其他的。 二、运行代码 代码如下&#xff1a; package 俄罗斯方块;import java.awt.BorderLayout; import java.awt.Color; import java.awt.Gr…

2024有哪些免费的mac苹果电脑内存清理工具?

在我们日常使用苹果电脑的过程中&#xff0c;随着时间的推移&#xff0c;可能会发现设备的速度变慢了&#xff0c;甚至出现卡顿的现象。其中一个常见的原因就是程序占用内存过多&#xff0c;导致系统无法高效地运行。那么&#xff0c;苹果电脑内存怎么清理呢&#xff1f;本文将…