IO进程:信号灯集

程序代码:

sem.h:

  1 #ifndef __SEM_H__2 #define __SEM_H__3 4 //创建信号灯集并初始化,semcount表示灯个数5 int open_sem(int semcount);6 7 //申请资源操作,semno表示灯的编号8 int P(int semid,int semno);9 10 //释放资源操作,semno表示灯的编号11 int V(int semid,int semno);12 13 //删除信号灯集14 int del_sem(int semid);15 16 #endif                                                                                            
~             

sem.c:

  1 #include<myhead.h>2 union semun3 {4     int val;5     struct semid_ds *buf;6     unsigned short *array;7     struct seminfo *__buf;8 };9 //定义给信号灯集中的指定信号灯赋值10 int init_semno(int semid,int semno)11 {12     union semun buf;13     printf("请输入要给编号为%d的灯设置的值:",semno);14     scanf("%d",&buf.val);15     //调用控制函数16     if(semctl(semid,semno,SETVAL,buf)==-1)17     {18         perror("semctl error");19         return -1;20     }21     return 0;22 }23 //创建或打开共享内存,参数为要申请的信号灯集中包含的灯的个数,返回值信号灯集的id24 int open_sem(int semcount)25 {26     //创建key值27     key_t key=-1;28     if((key=ftok("/",'s'))==-1)29     {30         perror("ftok error");31         return -1;32     }33     //通过key值创建一个信号灯集34     int semid=-1;35     if((semid=semget(key,semcount,IPC_CREAT|IPC_EXCL|0664))==-1)36     {37         //对错误码判断,EEXIST,说明信号灯集已存在38         if(errno==EEXIST)39         {40             //直接打开信号灯集即可41             semid=semget(key,semcount,IPC_CREAT|0664);42             return semid;43         }44         perror("semget error");45         return -1;46     }47     //给信号灯集的每个灯进行初始化操作48     for(int i=0;i<semcount;i++)49     {50         //对编号为i的灯进行初始化51         init_semno(semid,i);52     }53     return semid;54 }55 //进行申请资源操作,参数要申请的信号灯id,以及灯的编号56 int P(int semid,int semno)57 {58     //定义要执行操作的结构体变量59     struct sembuf buf;60     buf.sem_num=semno;61     buf.sem_op=-1;//申请资源62     buf.sem_flg=0;//阻塞方式申请63     //执行函数64     if(semop(semid,&buf,1)==-1)65     {66         perror("P error");67         return -1;68     }69     return 0;70 }71 //进行释放资源操作,参数为要申请的信号灯id,以及灯的编号72 int V(int semid,int semno)73 {74     struct sembuf buf;75     buf.sem_num=semno;76     buf.sem_op=1;77     buf.sem_flg=0;78     if(semop(semid,&buf,1)==-1)79     {80         perror("V error");81         return -1;82     }83     return 0;84 }85 //删除信号灯集的操作,参数为要删除的信号灯集86 int del_sem(int semid)87 {88     //删除信号灯集89     if(semctl(semid,0,IPC_RMID)==-1)                                                                                                                                                                                                                                         90     {91         perror("delete error");92         return -1;93     }94     return 0;95 }
~              

shmsnd.c:

  1 #include<myhead.h>2 #include "1.h"3 #define PAGE_SIZE 40964 int main(int argc, const char *argv[])5 {6     //11.创建并初始化一个信号灯集7     int semid=open_sem(2);8     //1.创建key值9     key_t key=-1;10     if((key=ftok("/",'k'))==-1)11     {12         perror("ftok error");13         return -1;14     }15     printf("key=%d\n",key);16     //2.将物理内存创建出共享内存段17     int shmid=-1;18     if((shmid=shmget(key,PAGE_SIZE,IPC_CREAT|0664))==-1)19     {20         perror("shmget error");21         return -1;22     }23     printf("shmid=%d\n",shmid);24     //3.将共享内存段地址映射到用户空间25     //NULL表示让系统自动选择页的分段26     //0表示当前进程对共享内存具有读写功能27     char *addr=(char *)shmat(shmid,NULL,0);28     if(addr==(void*)-1)29     {30         perror("shmat error");31         return -1;32     }33     printf("addr=%p\n",addr);34     //4.操作共享内存35     //char buf[128]="";36     while(1)37     {38         //22.申请0号灯的资源39         P(semid,0);40         printf("请输入>>>");41         fgets(addr,PAGE_SIZE,stdin);//从终端输入数据42         addr[strlen(addr)-1]='\0';//将换行换成'\0'43         printf("发送成功\n");44         //33.释放1号灯的资源45         V(semid,1);46         if(strcmp(addr,"quit")==0)47             break;48     }49     //5.取消映射50     if(shmdt(addr)==-1)51     {52         perror("shmdt error");53         return -1;54     }55     //6.删除共享内存56     if(shmctl(shmid,IPC_RMID,NULL)==-1)57     {58         perror("shmctl error");59         return -1;60     }61     return 0;62 }                                                                                                                                                                                                       
~          

 shmrcv:

  1 #include<myhead.h>2 #include"1.h"3 #define PAGE_SIZE 40964 int main(int argc, const char *argv[])5 {6     //11.创建信号灯集7     int semid=open_sem(2);8     //1.创建key值9     key_t key=-1;10     if((key=ftok("/",'k'))==-1)11     {12         perror("ftok error");13         return -1;14     }15     printf("key=%d\n",key);16     //2.将物理内存创建共享内存段17     int shmid=-1;18     if((shmid=shmget(key,PAGE_SIZE,IPC_CREAT|0664))==-1)19     {20         perror("shmget error");21         return -1;22     }23     printf("shmid=%d\n",shmid);24     //3.将共享内存段地址映射到用户空间25     //NULL表示让系统自动选择页分段26     //0表示当前进程对共享内存的读写功能27     char *addr=(char*)shmat(shmid,NULL,0);28     if(addr==(void*)-1)29     {30         perror("shmat error");31         return -1;32     }33     printf("addr=%p\n",addr);34     //4.操作共享内存35     //char buf[128]="";                                                                                                             36     while(1)37     {38         //22.申请1号灯的资源39         P(semid,1);40         printf("共享内存中的数据为:%s\n",addr);41         if(strcmp(addr,"quit")==0)42             break;43         //33.释放0号灯的资源44         V(semid,0);45     }46     //5.取消映射47     if(shmdt(addr)==-1)48     {49         perror("shmdt error");50         return -1;51     }52     //44.删除信号灯集53     del_sem(semid);54     return 0;55 }
~          

运行结果:

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

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

相关文章

ClickHouse 指南(三)最佳实践 -- 跳数索引

Data Skipping Indexes Data Skipping Indexes 2 1、简介 影响ClickHouse查询性能的因素很多。在大多数情况下&#xff0c;关键因素是ClickHouse在计算查询WHERE子句条件时是否可以使用主键。因此&#xff0c;选择适用于最常见查询模式的主键对于有效的表设计至关重要。 然…

【基础知识】MPP架构和hadoop架构比对

架构比对 简单一句描述。 mpp架构&#xff0c;就是找一群和自己能力差不多的任一起做事&#xff0c;每个人做的事情是一致的。 hadoop架构&#xff0c;就是找一群能力差一些的人&#xff0c;但只需要他们每个人只做一部分工作。 举例说明 一个特色小饭店如何成为连锁餐饮巨…

力扣hot100题解(python版7-9题)

7、接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,…

软件运维维保服务方案-套用模板

软件运维维保方案-套用模板 项目情况 1.1 项目背景简述项目的来源、目的和重要性。说明项目的规模、预算和预期目标。 1.2 项目现状分析当前系统/软件的运行状态、存在的问题和潜在风险。提供最近一次的维护报告或相关统计数据。服务简述 2.1 服务内容明确运维服务的具体内容&…

黑马程序员——接口测试——day03

目录&#xff1a; Potman断言 Postman断言简介Postman常用断言 断言响应状态码断言包含某字符串断言JSON数据Postman断言工作原理Postman关联 简介实现步骤核心代码创建环境案例1案例2Postman参数化 简介数据文件简介编写数据文件 CSV文件JSON文件导入数据文件到postman读取数…

YOLOv9图像标注和格式转换

一、软件安装 labelimg安装&#xff08;anaconda&#xff09; 方法一、 pip install labelImg 方法二、 pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple/ pip install pyqt5-tools -i https://pypi.tuna.tsinghua.edu.cn/simple/ pip install lxml -i ht…

第10讲用户登录SpringSecurity查库实现

用户登录SpringSecurity查库实现 security包下新建MyUserDetailServiceImpl Service public class MyUserDetailServiceImpl implements UserDetailsService {AutowiredSysUserService sysUserService;Overridepublic UserDetails loadUserByUsername(String username) throw…

理解@Configuration和@Component注解的不同用途和作用范围

理解Configuration和Component注解的不同用途和作用范围 在Spring框架中&#xff0c;Configuration和Component是两个常见的注解&#xff0c;用于实现依赖注入和组件扫描等功能。虽然它们都是用于标识类的注解&#xff0c;但它们在作用和用途上有着明显的区别。本文将深入探讨C…

通过苹果快捷指令轻松赚钱!一个月赚得23000元!

今天要分享的项目是《通过苹果快捷指令轻松赚钱&#xff01;一个月赚得23000元&#xff01;》 这是一个利用苹果快捷指令进行自动记账的项目&#xff0c;我在小红书上一个月就赚了23000元&#xff01;苹果自带的快捷指令几乎没有成本&#xff0c;但很多人愿意为此付费&#xf…

对话企企通CEO徐辉:数字采购何以搭建产业数字化“桥梁”?

站在产业的角度去思考问题&#xff0c;从互联生态的立场出发&#xff0c;做难而正确的事&#xff0c;赋能产业链上每一个玩家&#xff0c;同时为自己的商业模式创造更多的可能性。 作者|斗斗 出品|产业家 市场一变&#xff0c;整个产业能否在几天之内全部协同起来&#x…

车规级MCU的行业走向

1 主要厂家 车规级MCU&#xff08;车用微控制器单元&#xff09;的主要厂家包括&#xff1a; NXP半导体&#xff1a;NXP是全球领先的车规级MCU提供商之一&#xff0c;提供广泛的产品用于汽车控制和管理系统。英飞凌科技&#xff1a;作为汽车半导体的领导者之一&#xff0c;英飞…

【LeetCode】升级打怪之路 Day 01:二分法

今日题目&#xff1a; 704. 二分查找35. 搜索插入位置34. 在排序数组中查找元素的第一个和最后一个位置 目录 今日总结Problem 1: 二分法LeetCode 704. 二分查找 【easy】LeetCode 35. 搜索插入位置 ⭐⭐⭐⭐⭐LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置 【medi…