信号通信与消息队列实现的通信:2024/2/23

作业1:将信号和消息队列的课堂代码敲一遍

1.1 信号

1.1.1 信号默认、捕获、忽略处理(普通信号)

代码:

#include <myhead.h>
void handler(int signo)
{if(signo==SIGINT){printf("用户键入 ctrl+c\n");}
}
int main(int argc, const char *argv[])
{//忽略信号if(signal(SIGINT,SIG_IGN)==SIG_ERR){perror("signal error");return -1;}/*//默认处理信号if(signal(SIGINT,SIG_IGN)==SIG_ERR){perror("signal error");return -1;}//捕获信号if(signal(SIGINT,handler)==SIG_ERR){perror("signal error");return -1;}*/while(1){printf("123456\n");sleep(1);}return 0;
}

效果图:

 

1.1.2 SIGCHLD回收僵尸进程

代码:

#include <myhead.h>
void handler(int signo)
{if(signo==SIGCHLD){while(waitpid(-1,NULL,WNOHANG)>0);//waitpid(-1,NULL,WNOHANG);}
}
int main(int argc, const char *argv[])
{//捕获信号if(signal(SIGCHLD,handler)==SIG_ERR){perror("signal error");return -1;}//创建僵尸进程for(int i=0;i<5;i++){if(fork()==0){sleep(1);exit(EXIT_SUCCESS);}}while(1);return 0;
}

效果图:

1.1.3 模拟出牌

代码:

#include <myhead.h>//信号处理函数
void handler(int signo)
{if(signo==SIGALRM){printf("系统为您出了一张牌\n");alarm(5);}
}
int main(int argc, const char *argv[])
{//捕获SIGALRM信号if(signal(SIGALRM,handler)==SIG_ERR){perror("signal error");return -1;}alarm(5);             //启动定时器//出的牌char ch=0;while(1){scanf("%c",&ch);getchar();printf("你出的牌为:%c\n",ch);alarm(5);}return 0;
}

效果图:

1.1.4 发送信号函数

代码:

#include <myhead.h>void hander(int signo)
{if(signo==SIGUSR1){printf("大清亡了\n");raise(SIGKILL);}
}
int main(int argc, const char *argv[])
{//发送信号if(signal(SIGUSR1,hander)==SIG_ERR){perror("signal error");return -1;}//创建进程pid_t pid=fork();if(pid>0){//父进程while(1){printf("这是朕的江山\n");sleep(1);}}else if(pid==0){//子进程sleep(3);printf("我才是真命天子\n");kill(getppid(),SIGUSR1);while(1){printf("现在是我的了\n");sleep(1);}}else{perror("pid error");return -1;}return 0;
}

效果图:

 

1.2 消息队列

msgsnd.c:

#include <myhead.h>//消息队列结构体
struct msgbuf
{long mtype;char mtest[1024];
};
//宏表示消息正文的大小
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long)int main(int argc, const char *argv[])
{//创建 key 值key_t key=0;if((key=ftok("/",'k'))==-1){perror("ftok error");return -1;}printf("fork success key=%#x\n",key);//根据key值创建消息队列int msqid=-1;if((msqid=msgget(key,IPC_CREAT|0664))==-1){perror("msgget error");return -1;}printf("msgget success msqid=%#x\n",msqid);//定义一个消息struct msgbuf sbuf;while(1){//清空正文的容器bzero(sbuf.mtest,sizeof(sbuf.mtest));printf("请输入当前消息的类型:");scanf("%ld",&sbuf.mtype);getchar();                 //吸收垃圾字符printf("请输入消息正文:");fgets(sbuf.mtest,sizeof(sbuf.mtest),stdin);sbuf.mtest[strlen(sbuf.mtest)-1]='\0';//将消息存放到队列中msgsnd(msqid,&sbuf,MSGSIZE,0);printf("发送成功\n");if(strcmp(sbuf.mtest,"quit")==0){break;}}return 0;
}

msgrcv.c:

#include <myhead.h>//消息队列结构体
struct msgbuf
{long mtype;char mtest[1024];
};
//宏表示消息正文的大小
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long)int main(int argc, const char *argv[])
{//创建 key 值key_t key=0;if((key=ftok("/",'k'))==-1){perror("ftok error");return -1;}printf("fork success key=%#x\n",key);//根据key值创建消息队列int msqid=-1;if((msqid=msgget(key,IPC_CREAT|0664))==-1){perror("msgget error");return -1;}printf("msgget success msqid=%#x\n",msqid);//定义一个消息struct msgbuf rbuf;while(1){//清空正文的容器bzero(rbuf.mtest,sizeof(rbuf.mtest));//从消息队列中读取一个消息msgrcv(msqid,&rbuf,MSGSIZE,0,0);printf("收到的消息为:%s\n",rbuf.mtest);if(strcmp(rbuf.mtest,"quit")==0){break;}}//删除消息队列if(msgctl(msqid,IPC_RMID,NULL)!=0){perror("msgctl error");return -1;}return 0;
}

效果图:

作业2:使用消息队列完成两个进程间相互通信

msgsnd.c:

#include <myhead.h>//定义一个消息类型
struct msgbuf
{long mtype;char mtest[1024];
};//宏表示消息正文大小
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long)/*****************************主程序***********************/
int main(int argc, const char *argv[])
{//1、创建key值key_t key=0;if((key=ftok("/",'k'))==-1){perror("ftok error");return -1;}//根据key值创建一个消息队列int msqid=-1;if((msqid=msgget(key,IPC_CREAT|0664))==-1){perror("msgget error");return -1;}//创建一个子进程pid_t pid=fork();if(pid>0){//父进程向消息队列中写入类型为1的消息正文//定义一个消息struct msgbuf sbuf;sbuf.mtype=1;while(1){//清空容器bzero(sbuf.mtest,sizeof(sbuf.mtest));printf("发送的消息:");fgets(sbuf.mtest,sizeof(sbuf.mtest),stdin);sbuf.mtest[strlen(sbuf.mtest)-1]='\0';//将消息存放到消息队列msgsnd(msqid,&sbuf,MSGSIZE,0);printf("发送成功\n");if(strcmp(sbuf.mtest,"quit")==0){break;}}	}else if(pid==0){//子进程从消息队列中取出类型为2的消息正文//定义一个消息struct msgbuf rbuf;while(1){//清空容器bzero(rbuf.mtest,sizeof(rbuf.mtest));//从消息队列中读取类型为2的消息正文msgrcv(msqid,&rbuf,MSGSIZE,2,0);printf("收到的消息为:%s\n",rbuf.mtest);if(strcmp(rbuf.mtest,"quit")==0){break;}}}else{perror("fork error");return -1;}return 0;
}

msgrcv.c:

#include <myhead.h>//定义一个消息类型
struct msgbuf
{long mtype;char mtest[1024];
};//宏表示消息正文大小
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long)/*****************************主程序***********************/
int main(int argc, const char *argv[])
{//1、创建key值key_t key=0;if((key=ftok("/",'k'))==-1){perror("ftok error");return -1;}//根据key值创建一个消息队列int msqid=-1;if((msqid=msgget(key,IPC_CREAT|0664))==-1){perror("msgget error");return -1;}//创建一个子进程pid_t pid=fork();if(pid>0){//父进程从消息队列中取出类型为1的消息正文//定义一个消息struct msgbuf rbuf;while(1){//清空容器bzero(rbuf.mtest,sizeof(rbuf.mtest));//从消息队列中读取类型为1的消息正文msgrcv(msqid,&rbuf,MSGSIZE,1,0);printf("收到的消息为:%s\n",rbuf.mtest);if(strcmp(rbuf.mtest,"quit")==0){break;}}}else if(pid==0){//子进程向消息队列中写入类型为2的消息正文//定义一个消息struct msgbuf sbuf;sbuf.mtype=2;while(1){//清空容器bzero(sbuf.mtest,sizeof(sbuf.mtest));printf("发送的消息:");fgets(sbuf.mtest,sizeof(sbuf.mtest),stdin);sbuf.mtest[strlen(sbuf.mtest)-1]='\0';//将消息存放到消息队列msgsnd(msqid,&sbuf,MSGSIZE,0);printf("发送成功\n");if(strcmp(sbuf.mtest,"quit")==0){break;}}}else{perror("fork error");return -1;}return 0;
}

效果图:

作业3:思维导图

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

redis GEO 类型原理及命令详解

目录 前言 一、GeoHash 的编码方法 二、Redis 操作GEO类型 前言 我们有一个需求是用户搜索附近的店铺&#xff0c;就是所谓的位置信息服务&#xff08;Location-Based Service&#xff0c;LBS&#xff09;的应用。这样的相关服务我们每天都在接触&#xff0c;用滴滴打车&am…

文章SCI/EI检索流程

前言&#xff1a; 想查询某篇文章是否被SCI/EI检索&#xff0c;以及其对应SCI/EI检索号可通过以下流程查询。 一、SCI检索 网址&#xff1a;https://webofscience-clarivate-cn-s.xidian.yitlink.com/wos/alldb/basic-search 搜索对应论文的题目&#xff0c;若有对应查询结果…

无法收到邮箱验证码

我们在注册&#xff0c;找回密码的时候&#xff0c;如果没有收到验证码&#xff0c;可以尝试以下几种方式解决: 使用QQ邮箱注册 现在常用的邮箱应该是QQ邮箱&#xff0c;所以后台也是使用QQ邮箱给大家发送验证码&#xff0c;所以大家的接受邮箱也最后是qq邮箱 在垃圾箱中查找…

Nginx 配置前端工程项目二级目录

前提&#xff1a; 前端工程技术框架: vue 后端工程技术工程&#xff1a;spring boot 需求&#xff1a;需要通过二级目录访问前端工程&#xff1a; 如之前&#xff1a;http://127.0.0.1:80/ 改成 http://127.0.0.1/secondDirectory:80/ 一.前端工程支持二级目录 1.编译文…

C 标准库 - <errno.h>

在C语言编程中&#xff0c;<errno.h> 头文件扮演着至关重要的角色&#xff0c;它提供了一个全局变量 errno 以及一系列预定义宏&#xff0c;用于指示系统调用或库函数执行过程中发生的错误。这些宏有助于程序员诊断和处理运行时错误。 errno 变量 extern int errno;err…

flannel网络拓扑

测试环境创建 在k8s中部署flannel网络插件 https://blog.csdn.net/weixin_64124795/article/details/128894411 参考文章部署k8s集群和flannel网络插件 我的k8s集群物理环境 我的集群中只有两个节点master和node1节点 [rootmaster sjs]# kubectl get node NAME STATU…

音视频技术-声反馈啸叫的产生与消除

目录 1.均衡调节: 2.移频法: 3.移相法: 4.比较法: 在扩音系统中,产生啸叫危害很大,一方面影响会议、演出等活动的正常进行,另一方面严重的啸叫会导致音响设备的损坏。 “啸叫”是“声反馈”的俗称,形成的机制复杂,消除的手段多样,专业调音师也对

Windows软件卸载基本思路

&#x1f4ab;作者&#xff1a;南城余 &#x1f31f;全平台账号&#xff1a;公众号、CSDN、GitHub、语雀、知乎 前提提要&#xff1a; 相信大家都被Windows软件卸载恶心过吧&#xff1f; 那Windows软件到底应该怎么卸载呢&#xff1f; 跟着下面方法&#xff0c;你一定可以成…

谷歌最新黑科技:Gemini 1.5携100万Token挑战AI多模态极限

最近科技圈再次迎来震撼弹&#xff01;除了火爆全球的openAI Sora文生视频模型外&#xff0c;谷歌发布了其大模型矩阵的最新成员——Gemini 1.5&#xff0c;一举将上下文窗口长度扩展至惊人的100万个tokens。这不仅仅是一个简单的数字增加&#xff0c;而是一次划时代的飞跃&…

SpringCloud-Gateway解决跨域问题

Spring Cloud Gateway是一个基于Spring Framework的微服务网关&#xff0c;用于构建可扩展的分布式系统。在处理跨域问题时&#xff0c;可以通过配置网关来实现跨域资源共享&#xff08;CORS&#xff09;。要解决跨域问题&#xff0c;首先需要在网关的配置文件中添加相关的跨域…

linux逻辑卷/dev/mapper/centos-root扩容增加空间

centos7中/dev/mapper/centos-root扩容 问题文件系统根目录&#xff0c;/dev/mapper/centos-root空间满了&#xff0c;导致k8s不停重启 1.查看磁盘情况 df -h #查看最大占用目录 du -h -x --max-depth12.查看磁盘信息 fdisk -l3.查看磁盘分区层级 lsblk可见剩余空闲60G空间…

二十三、视频处理和保存

项目功能实现&#xff1a;获取视频的参数信息&#xff0c;对视频文件进行转换到HSV色域空间并保存到指定路径中去 按照之前的博文结构来&#xff0c;这里就不在赘述了 一、头文件 video_save.h #pragma once#include<opencv2/opencv.hpp>using namespace cv;class Vid…

Redis(十六)缓存预热+缓存雪崩+缓存击穿+缓存穿透

文章目录 面试题缓存预热缓存雪崩解决方案 缓存穿透解决方案 缓存击穿解决方案案例&#xff1a;高并发聚划算业务 总结表格 面试题 缓存预热、雪崩、穿透、击穿分别是什么?你遇到过那几个情况?缓存预热你是怎么做的?如何避免或者减少缓存雪崩?穿透和击穿有什么区别?他两是…

websocket了解下

websocket请求长啥样 GET /chat HTTP/1.1 Host: example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ Sec-WebSocket-Version: 13 啥是websocket websocket是http的一种&#xff0c;服务器可以主动向客户端推送信息&#xff0c;…

电阻篇 | 二、压敏电阻

电阻篇 | 二、压敏电阻 定义 压敏电阻是一种具有非线性伏安特性得电阻器件&#xff0c;无极性&#xff0c;主要用在电路承受过压时进行电压钳位&#xff0c;吸收多余得电流以保护敏感器件&#xff0c;英文名称 Voltage Dependent Resistor&#xff0c;简称VDR&#xff0c;或者…

适合上班族使用的便签备忘录推荐哪个?

在如今较为繁忙的职场中&#xff0c;上班族家人们经常需要处理各种琐碎的工作任务。为了更好地管理时间、提高工作效率&#xff0c;一款好用的便签备忘录成为了不少上班族的首选工具。市面上各式各样的便签备忘录都有&#xff0c;但好用便签以其简洁方便的操作方式和多样化功能…

Excel快速下拉填充数据至9999行,再筛选出想要的数据

1 测试计算公式 2 选中单元格 3 批量赋值 4 数据筛选&#xff1a; 数据 -> 自动筛选 &#xff0c;列头出现三角箭头&#xff0c;进行过滤就可以了

证件照(兼容H5,APP,小程序)

证件照由uniappuyui开发完成&#xff0c;并同时兼容H5、App、微信小程序、支付宝小程序&#xff0c;其他端暂未测试。 先看部分效果图吧具体可以下方复制链接体验demo 首页代码 <template><view class""><view class"uy-m-x-30 uy-m-b-20"…

记一次 Flink 作业启动缓慢

记一次 Flink 作业启动缓慢 背景 应用发现&#xff0c;Hadoop集群的hdfs较之前更加缓慢&#xff0c;且离线ELT任务也以前晚半个多小时才能跑完。此前一直没有找到突破口所以没有管他&#xff0c;推测应该重启一下Hadoop集群就可以了。今天突然要重启一个Flink作业&#xff0c…

大模型分布式训练方法FDSP和DeepSpeed

备注&#xff1a; 本文部分内容参考自其他作者的内容&#xff0c;如有不妥&#xff0c;请联系&#xff0c;立即删除。 pytorch单精度、半精度、混合精度、单卡、多卡&#xff08;DP / DDP&#xff09;、FSDP、DeepSpeed模型训练 相关代码&#xff1a;pytorch-model-train-temp…