IO进程线程day9作业

news/2024/11/14 16:44:07/

 

#ifndef _SEM_H_
#define _SEM_H_
#include<myhead.h>
//信号灯集的申请,初始化信号灯,并返回信号灯集的id
int create_sem(int semcount);//申请信号灯资源操作  P操作  -1
int P(int semid,int semno);//释放信号灯资源操作  V操作  +1
int V(int semid ,int semno);//删除信号灯集
int del_sem(int semid);#endif
#include<myhead.h>
#include"sem.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_sem(int semid,int i)
{int val = -1;printf("请输入第%d个的val值:",i);scanf("%d",&val);union semun su;su.val = val;if(semctl(semid,i,SETVAL,su) == -1){perror("semctl");return -1;}
}//信号灯集的申请,初始化信号灯,并返回信号灯集的id
int create_sem(int semcount)
{//1、创建key值key_t key = ftok("/",'k');if(key == -1){perror("ftok");return -1;}//2、通过key值创建一个信号灯集int semid = semget(key,semcount,IPC_CREAT|IPC_EXCL|0664);if(semid == -1){if(errno == EEXIST){semid = semget(key,semcount,IPC_CREAT);return semid;}perror("semget");return -1;}//3、给信号灯集中的信号等进行初始化操作for(int i =0;i<semcount;i++){init_sem(semid,i);}//4、返回信号灯集的idreturn semid;}//申请信号灯资源操作  P操作  -1
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("semop P");return -1;}return 0;
}//释放信号灯资源操作  V操作  +1
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("semop V");return -1;}return 0;
}//删除信号灯集
int del_sem(int semid)
{if(semctl(semid,0,IPC_RMID,0)== -1){perror("semctl aa");return -1;}
}
#include <myhead.h>
#include "sem.h"
#define SIZE_PAGE 4096
int main(int argc, const char *argv[])
{//定义一个变量存放pidint pid1 = -1,pid2 = -1;//1.创建信号灯集int semid = create_sem(3);if(semid == -1){perror("create error");return -1;}//创建子进程1pid1 = fork();if(pid1 == 0){int count = 0;//子进程1while(count <5 ) {	count++;P(semid,0);    //申请0号灯资源sleep(1);printf("B");fflush(stdout);V(semid,1);      //释放1号灯资源}//退出子进程1exit(EXIT_SUCCESS);}else if(pid1 > 0){//创建子进程2pid2 = fork();if(pid2 == 0){int count = 0;//子进程2while(count < 5){count++;P(semid,1);    //申请1号灯资源sleep(1);printf("C\n");    V(semid,2);   //释放2号灯资源}//退出子进程2exit(EXIT_SUCCESS);}else if(pid2 > 0){int count = 0;//父进程while(count < 5){P(semid,2);   //申请2号灯资源sleep(1);printf("A");fflush(stdout);V(semid,0);  //释放0号灯资源count ++;}//回收子进程wait(NULL);wait(NULL);//删除信号灯资源del_sem(semid);return 0;}else{perror("fork pid2 error");return -1;}}else{perror("fork pid1 error");return -1;}return 0;
}

 


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

相关文章

杨辉三角形-第11届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第17讲。 杨辉三角形&#…

宋仕强论道之华强北的硬件设施(二十三)

宋仕强论道之华强北的硬件设施&#xff08;二十三&#xff09;&#xff1a; 现在深圳市华强北&#xff08;Shenzhen Huaqiangbei&#xff09;硬件设施哪方面不足呢&#xff1f;以前华强北的“万家百货”和“女人世界”在生意最旺的时候&#xff0c;顾客要在门口排队进商场&…

网络安全知识点总结

网络安全是确保计算机网络免受未经授权的访问、攻击、破坏、更改或泄露的一系列措施和技术的综合体。以下是关于网络安全的更详细的知识点总结&#xff1a; 防火墙和边界安全: 实施防火墙以监控和控制网络流量。边界防御策略包括网络地址转换&#xff08;NAT&#xff09;和端口…

『亚马逊云科技产品测评』活动征文|AWS云服务器EC2实例实现ByConity快速部署

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 前言 亚马逊是全球最大的在线零售商和云计算服务提供商。AWS云服务器在…

对多个 App 设计工具组件使用一个回调

当要在App 中提供多种方法来执行某个操作时&#xff0c;在组件间共享回调非常有用。例如&#xff0c;当用户点击按钮或在编辑字段中按下 Enter 键时&#xff0c;App 可以用同样的方式响应。 共享回调的示例 此示例说明如何创建一个 App&#xff0c;其中包含共享一个回调的两个…

GLB/GLTF 模型压缩轻量化

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 1、具有 Draco 压缩的 GLTF 和 GLB 文件格式 随着对沉浸式 3D 体验的…

创建存储函数

字段名 数据类型 主键 外键 非空 唯一 自增 id INT 是 否 是 是 否 name VARCHAR(50) 否 否 是 否 否 glass VARCHAR(50) 否 否 是 否 否 sch 表内容 id name glass 1 xiaommg glass1 2 xiaojun glass2 1、创建一个可以统计表格内记录条…

uni-app点击预览图片

<image :src"info.shopLogoUrl" tap"_previewImage(info.shopLogoUrl)" mode"widthFix" >_previewImage(image) {var imgArr [];imgArr.push(image);//预览图片uni.previewImage({urls: imgArr,current: imgArr[0]});},大佬地址