2.26作业

news/2024/12/22 3:01:06/

2.将信号灯集的函数二次封装

sem.c

#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 init_semno(int semid,int semno)
{union semun buf;printf("请输入要给编号为%d的灯设置的值:",semno);scanf("%d",&buf.val);//调用控制函数if(semctl(semid,semno,SETVAL,buf) == -1){perror("semctl error");return -1;}return 0;
}//创建或打开共享内存:参数为要申请的信号灯集中包含的灯的个数,返回值信号灯集的id
int open_sem(int semcount)
{//创建key值key_t key = -1;if((key = ftok("/",'s')) == -1){perror("ftok error");return -1;}//通过key值创建一个信号灯集int semid = -1;if((semid = semget(key,semcount,IPC_CREAT|IPC_EXCL|0664)) == -1){//对错误码进行判断,如果错误码为EEXIST,说明信号灯集已经存在if(errno == EEXIST){//直接打开信号灯集即可semid = semget(key ,semcount ,IPC_CREAT|0664);return semid;}perror("semget error");return -1;}//给信号灯集中的每个灯进行初始化操作for(int i=0; i<semcount; i++){init_semno(semid,i);     //对编号为i的灯进行初始化}return semid;
}//进行申请资源操作:参数为要申请的信号灯id,以及灯的编码
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;
}//进行释放资源操作:参数为要申请的信号灯id,以及灯的编号
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;}//删除信号灯集的操作:参数为要删除的信号灯集id
int del_sem(int semid)
{//删除信号灯集if(semctl(semid,0,IPC_RMID) == -1){perror("delete error");return -1;}return 0;
}

shmrcv.c

#include<myhead.h>
#include"sem.h"
#define PAGE_SIZE 4096         //一页大小
int main(int argc, const char *argv[])
{//创建信号灯集int semid = open_sem(2);//创建key值key_t key = -1;if((key = ftok("/",'k')) == -1){perror("ftok error");return -1;}printf("key = %d\n", key);//通过key值创建一个共享内存int shmid = -1;if((shmid = shmget(key ,PAGE_SIZE, IPC_CREAT|0664)) == -1){perror("shmget error");return -1;}printf("shmid = %d\n",shmid);//将共享内存段的数据映射到用户空间char *addr = shmat(shmid, NULL,0);//参数2:让系统自动选择对其页//参数3:对共享内存的操作为读写操作if(addr == (void*)-1){perror("shmat error");return -1;}printf("addr = %p\n",addr);//4.使用共享内存while(1){//申请1号灯的资源P(semid,1);printf("收到数据为:%s\n",addr);//判断输入的内容if(strcmp(addr,"quit")== 0){break;}//释放0号灯的资源V(semid,0);}//5.取消映射关系if(shmdt(addr) == -1){perror("shmdt error");return -1;}//删除信号灯集del_sem(semid);return 0;
}

shmsnd.c

#include<myhead.h>
#include"sem.h"
#define PAGE_SIZE 4096         //一页大小
int main(int argc, const char *argv[])
{//创建信号灯集int semid = open_sem(2);//创建key值key_t key = -1;if((key = ftok("/",'k')) == -1){perror("ftok error");return -1;}printf("key = %d\n", key);//通过key值创建一个共享内存int shmid = -1;if((shmid = shmget(key ,PAGE_SIZE, IPC_CREAT|0664)) == -1){perror("shmget error");return -1;}printf("shmid = %d\n",shmid);//将共享内存段的数据映射到用户空间char *addr = shmat(shmid, NULL,0);//参数2:让系统自动选择对其页//参数3:对共享内存的操作为读写操作if(addr == (void*)-1){perror("shmat error");return -1;}printf("addr = %p\n",addr);//4.使用共享内存while(1){//申请0号灯的资源P(semid,0);printf("请输入>>");fgets(addr,PAGE_SIZE,stdin);addr[strlen(addr)-1]=0;printf("数据发送成功\n");//释放1号灯的资源V(semid,1);//判断输入的内容if(strcmp(addr,"quit")== 0){break;}	if(strcmp(addr,"q")== 0){break;}}//5.取消映射关系if(shmdt(addr) == -1){perror("shmdt error");return -1;}//删除共享函数if(shmctl(shmid,IPC_RMID,NULL) == -1){perror("shmctl error");return -1;}return 0;
}


http://www.ppmy.cn/news/1365041.html

相关文章

Eigen-Array数组类和系数式运算

Array数组类和系数式运算&#xff09; 一、概述二、数组类型三、访问数组中的值四、加减法五、乘法六、其他系数相关的操作七、数组和矩阵表达式之间转换 一、概述 Array类提供了通用数组&#xff0c;而Matrix类则用于线性代数。此外&#xff0c;Array类提供了一种简单的方法来…

Linux中死锁种类和解决方法

死锁&#xff1a; 第一种&#xff1a; 加了两次锁&#xff0c;导致还没解锁就想获得锁&#xff0c;一直阻塞&#xff1a; void*mythread(void *arg) {int n5000;int x;while(n--){pthread_mutex_lock(&mutex);pthread_mutex_lock(&mutex);xnumber;x;numberx;pthread…

如何选购油烟净化器?环保性能与个人需求的完美契合

我最近分析了餐饮市场的油烟净化器等产品报告&#xff0c;解决了餐饮业厨房油腻的难题&#xff0c;更加方便了在餐饮业和商业场所有需求的小伙伴们。 在选择油烟净化器时&#xff0c;环保性能与个人需求的完美契合至关重要。下面&#xff0c;让我们一起探讨如何选购适合自己的油…

初识Lombok

前言 最近读一些公司的业务代码&#xff0c;发现近几年的java项目工程中都使用了lombok&#xff0c;lombok是一个可以自动生成get,set、toString等模板类方法的工具框架&#xff0c;程序再引入lombok后&#xff0c;添加一个注解便可以不写get\set\toString等方法。 Lombok示例…

蓝桥杯Learning

Part 1 递归和递推 1. 简单斐波那契数列 n int(input())st [0]*(47) # 注意这个地方&#xff0c;需要将数组空间设置的大一些&#xff0c;否则会数组越界 st[1] 0 st[2] 1 # 这个方法相当于是递推&#xff0c;即先求解一个大问题的若干个小问题 def dfs(u):if u 1:print(…

未来新质生产力Agent的起源与应用

Agent是什么&#xff1f; AI Agent的发展经历了从哲学思想启蒙到计算机科学助力、专家系统兴起、机器学习崛起、深度学习突破等多个阶段。如今&#xff0c;AI Agent已经成为人工智能领域的重要组成部分&#xff0c;为人类带来了巨大的便利和发展机遇。早在古希腊时期&#xff0…

第十一天-Excel的操作

目录 1.xlrd-Excel的读模块 安装 使用 获取工作簿 读取工作簿的内容 xlsxwriter-Excel的写模块 安装 使用 生成图表 add_series参数 图表的样式 demo&#xff1a;生成图表 Excel的操作在python中有多个模块&#xff0c;为了能够快速使用&#xff0c;选择了相对简单…

【MySQL】_联合查询基础表

联合查询也称为多表查询&#xff0c;是将多个表联合到一起进行查询&#xff1b; 笛卡尔积是联合查询的基础&#xff0c;笛卡尔积其实就是一种排列组合&#xff0c;把两张表的记录尽可能地排列组合出n种情况&#xff1a; 以两张表&#xff1a;班级表与学生表为例&#xff0c;计…