IO进程线程 day7
使用消息队列完成两个进程之间相互通信
#include<my_head.h>
struct msgbuf
{long mtype;char mtext[128];
};
#define SIZE (sizeof(struct msgbuf) - sizeof(long))//分支线程从消息队列中读取类型2的消息
void *task(void *arg)
{int msgid = *((int *)arg);struct msgbuf buf;while(1){msgrcv(msgid,&buf,SIZE,2,0);printf("收到消息:%s\n",buf.mtext);if(strcmp(buf.mtext,"quit") == 0)break; }pthread_exit(NULL);
}int main(int argc, const char *argv[])
{//创建key值key_t key = ftok("/",'k');if(key == -1){perror("ftok error");return -1;}//用key值创建消息队列int msgid = msgget(key,IPC_CREAT|0664);if(msgid == -1){perror("msgget error");return -1;}//创建分支线程pthread_t tid = -1;if(pthread_create(&tid,NULL,task,&msgid) != 0){printf("create tid error\n");return -1;}//主线程向消息队列中存放类型1的消息struct msgbuf buf;while(1){printf("请输入消息类型1>>>");scanf("%ld",&buf.mtype);printf("请输入消息正文:");scanf("%s",buf.mtext);msgsnd(msgid,&buf,SIZE,0);if(strcmp(buf.mtext,"quit") == 0)break; }//删除消息队列if(msgctl(msgid,IPC_RMID,NULL) == -1){perror("msgctl error");return -1;}//阻塞回收分支线程资源pthread_join(tid,NULL);return 0;
}
#include<my_head.h>
struct msgbuf
{long mtype;char mtext[128];
};
#define SIZE (sizeof(struct msgbuf) - sizeof(long))//分支线程从消息队列中读取类型1的消息
void *task(void *arg)
{int msgid = *((int *)arg);struct msgbuf buf;while(1){msgrcv(msgid,&buf,SIZE,1,0);printf("收到消息:%s\n",buf.mtext);if(strcmp(buf.mtext,"quit") == 0)break; }pthread_exit(NULL);
}int main(int argc, const char *argv[])
{//创建key值key_t key = ftok("/",'k');if(key == -1){perror("ftok error");return -1;}//用key值创建消息队列int msgid = msgget(key,IPC_CREAT|0664);if(msgid == -1){perror("msgget error");return -1;}//创建分支线程pthread_t tid = -1;if(pthread_create(&tid,NULL,task,&msgid) != 0){printf("create tid error\n");return -1;}//主线程向消息队列中存放类型2的消息struct msgbuf buf;while(1){printf("请输入消息类型2>>>");scanf("%ld",&buf.mtype);printf("请输入消息正文>>>");scanf("%s",buf.mtext);msgsnd(msgid,&buf,SIZE,0);if(strcmp(buf.mtext,"quit") == 0)break; }//阻塞回收分支线程资源pthread_join(tid,NULL);return 0;
}
将信号通信相关代码重新实现一遍
#include<my_head.h>
//信号处理函数
void handler(int signo)
{if(signo == SIGCHLD){waitpid(-1,NULL,WNOHANG);kill(getpid(),SIGKILL);}if(signo == SIGUSR1){printf("逆子,何至于此!!\n");}
}int main(int argc, const char *argv[])
{//创建一个子进程int pid = fork();if(pid > 0){//父进程通过绑定信号函数,将子进程发送的信号捕获后用函数处理if(signal(SIGCHLD,handler) == SIG_ERR){perror("signal error");return -1;}if(signal(SIGUSR1,handler) == SIG_ERR){perror("signal error");return -1;}//父进程在运行中while(1){printf("我真的还想再活500年\n");sleep(1);}}else if(pid == 0){//子进程在运行中,发送一个信号给父进程printf("来来来,喝酒喝酒!!!\n");sleep(5);printf("我已看破红尘,父亲陪我走吧\n");kill(getppid(),SIGUSR1);//子进程退出sleep(2);exit(EXIT_SUCCESS);}else{perror("fork error");return -1;}return 0;
}
将共享内存相关代码重新实现一遍
发送端:
#include<my_head.h>
#define PAGE_SIZE 4096int main(int argc, const char *argv[])
{//创建key值int key = ftok("/",'k');if(key == -1){perror("");return -1;}//创建共享内存段int shmid = shmget(key,PAGE_SIZE,IPC_CREAT|0664);if(shmid == -1){perror("shmget error");return -1;}//将共享内存段映射到用户空间char *addr = (char *)shmat(shmid,NULL,0);if(addr == (void *)-1){perror("");return -1;}printf("addr = %p\n",addr);//操作共享内存段while(1){fgets(addr,PAGE_SIZE,stdin);addr[strlen(addr)-1] = 0;if(strcmp(addr,"quit") == 0)break;}//取消映射if(shmdt(addr) == -1){perror("shmdt error");return -1;}//删除共享内存if(shmctl(shmid,IPC_RMID,NULL) == -1){perror("shmctl error");return -1;}return 0;
}
#include<my_head.h>
#define PAGE_SIZE 4096int main(int argc, const char *argv[])
{//创建key值int key = ftok("/",'k');if(key == -1){perror("");return -1;}//创建共享内存段int shmid = shmget(key,PAGE_SIZE,IPC_CREAT|0664);if(shmid == -1){perror("shmget error");return -1;}//将共享内存段映射到用户空间char *addr = (char *)shmat(shmid,NULL,0);if(addr == (void *)-1){perror("");return -1;}printf("addr = %p\n",addr);//操作共享内存段while(1){printf("共享内存中的数据为:%s\n",addr);sleep(1);if(strcmp(addr,"quit") == 0)break;}//取消映射if(shmdt(addr) == -1){perror("");return -1;}return 0;
}
相关文章:
IO进程线程 day7
使用消息队列完成两个进程之间相互通信 #include<my_head.h> struct msgbuf {long mtype;char mtext[128]; }; #define SIZE (sizeof(struct msgbuf) - sizeof(long))//分支线程从消息队列中读取类型2的消息 void *task(void *arg) {int msgid *((int *)arg);struct msg…...
扩展学习|数据融合助推商务智能与分析
文献来源:[1]李爱华,续维佳,石勇.基于数据融合的商务智能与分析架构研究[J].计算机科学,2022,49(12):185-194. 一、信息融合 (一)信息融合定义演变 早期信息融合的定义指出,其主要任务是综合分析若干传感器观测到的信息[9,…...
Java项目:112SSM在线电影订票系统
博主主页:Java旅途 简介:分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 在线电影订票系统基于SpringSpringMVCMybatis开发,系统分为前台和后台,前台主要用来用户浏览电影信息,订票,…...
Echarts——使用graphic组件在一个option内同时设置两个饼图的背景图
使用echarts的graphic原生图形元素组件,为两个饼图设置对应背景。 <template><div id"app"><div class"charts" ref"charts"></div></div> </template><script> import * as echarts from…...
编程笔记 html5cssjs 027 HTML输入属性(1/2)
[TOC](编程笔记 html5&css&js 027 HTML输入属性(1/2)) <input>元素除了type属性表示输入类型,后面还跟上其他属性,叫输入属性。 value 属性 value 属性规定输入字段的初始值: <form action"">First name:<…...
请求参数乱码问题
POST请求方式解决乱码问题 在web.xml里面设置编码过滤器 <filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><!-- 设置过滤器中的属性值 -…...
【leetcode】力扣热门之反转链表【简单难度】
题目描述 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 用例 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 输入:head [1,2] 输出:[2,1] 输入:head [] 输出:[…...
【sgPasswordInput】自定义组件:带前端校验密码强度的密码输入框,能够提供密码强度颜色提示和文字提示
特性: 有密码强度颜色提示密码强度进度条提示支持设置默认输入提示和密码长度 sgPasswordInput源码 <template><div :class"$options.name" style"width: 100%"><el-inputstyle"width: 100%"ref"psw"type&…...
1599 - Ideal Path (UVA)
题目链接如下: https://onlinejudge.org/index.php?optioncom_onlinejudge&Itemid8&category448&pageshow_problem&problem4474 这道题也是看了刘汝佳的思路才写出来的.... 代码如下: #include <cstdio> #include <deque&…...
计算机网络(超级详细笔记)
使用教材计算机网络(第8版)(谢希仁) 第一章:概述 第二章:物理层 第三章:数据链路层 第四章:网络层 第五章:运输层 第六章:应用层 目…...
老杨说运维 | 年末大讲回顾:运维的尽头也是大模型吗?
哈喽~朋友们,这么快又见面啦。前阵子我们给CEO老杨安排了一场年末大讲,主要是跟大家聊聊智能运维的“智”与“能”以及剖析时下热点----运维大模型。后台收到了不少朋友的反馈,小编看了大受鼓舞并暗下决心----新的一年,希望能多安…...
Unity 利用UGUI之Scrollbar制作进度条
在Unity中除了用Slider、Image做进度条,其实用Scrollbar也可以做进度条。 首先,在场景中新建一个Scrollbar组件和一个Text组件: 其次,创建模拟进度的一个脚本,Scrollbar_Progressbar.cs: using System.Collections; …...
MySQL之导入、导出
文章目录 1.navicat导入导出2.mysqldump命令导入导出2.1导出2.2导入 3.load data infile命令导入导出4.远程备份5.思维导图 1.navicat导入导出 使用Navicat工具导入t_log 共耗时 55s 2.mysqldump命令导入导出 2.1导出 导出表数据和表结构 语法: mysqldump -u用…...
【unity小技巧】FPS游戏实现相机的偏移震动、武器射击后退和后坐力效果
最终效果 文章目录 最终效果前言相机偏移震动相机震动脚本换弹节点震动 武器射击后退效果武器后坐力效果完结 前言 关于后坐力之前其实已经分享了一个:FPS游戏后坐力制作思路 但是实现起来比较复杂,如果你只是想要简单的实现,可以看看这个&…...
MINCO+汽车
规划典型的解决方法: 如何准确的描述他的动力学,实际上是对这个物理对象进行建模.(规划等于开环的控制,控制等于闭环的规划),规划系统要做到是假设已知系统模型的情况下去计算一些可能会影响比较好的 未来运动的指令,做未来运动轨迹的推演.对自己建模的情况下还需对环境有个比较…...
大模型机器人发展史:从VoxPoser、RT2到斯坦福Mobile ALOHA、Google机器人
前言 23年7月,我在朋友圈评估Google的RT2说道: “大模型正在革新一切领域啊,超帅,通过大模型不仅能理解“人话”,还能对“人话”进行推理,并转变为机器人能理解的指令,从而分阶段完成任务。回…...
Ubunutu18.04 ROS melodic 无人机 XTDrone PX4 Vins-Fuison 运行配置
一、PX4飞控EKF配置 PX4默认使用的EKF配置为融合GPS的水平位置与气压计高度。如果我们想使用视觉定位,就需要把修改配置文件。让EKF融合来自mavros/vision_pose/pose的数据 1.1修改rcS配置文件 gedit ~/PX4_Firmware/ROMFS/px4fmu_common/init.d-posix/rcS 通过注…...
Linux 常见服务配置
笔记所以内容很多,建议选择性看看 SSH Secure Shell 用于与服务器建立安全的连接 对应服务 sshd 注意:配置文件 配制文件修改需要重启或重载sshd服务才能生效 systemctl sshd reload # 重载 sshd 配置文件 systemctl sshd restart # 重启 ssh…...
Flutter基础
一、关键字 class:用于定义一个新的类; extends: 用于指定一个类继承另一个类; mixin: 用于将一个类的代码片段添加到另一个类中,实现代码复用; abstract: 用于声明一个抽象类或抽象方法,不能直接实例化&a…...
MySQL-数据库概述
数据库相关概念: 数据库(DateBase)简称DB,就是一个存储数据的仓库,数据有组织的进行存储。 数据库分为关系型数据库简称RDBMS和非关系型数据库 关系型数据库简称RDBMS:建立在关系模型的基础上,由多张相互连接的二维表组成的数据库.简单来说…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
持续交付的进化:从DevOps到AI驱动的IT新动能
文章目录 一、持续交付的本质:从手动到自动的交付飞跃关键特性案例:电商平台的高效部署 二、持续交付的演进:从CI到AI驱动的未来发展历程 中国…...
Angular中Webpack与ngx-build-plus 浅学
Webpack 在 Angular 中的概念 Webpack 是一个模块打包工具,用于将多个模块和资源打包成一个或多个文件。在 Angular 项目中,Webpack 负责将 TypeScript、HTML、CSS 等文件打包成浏览器可以理解的 JavaScript 文件。Angular CLI 默认使用 Webpack 进行项目…...
Qt 按钮类控件(Push Button 与 Radio Button)(1)
文章目录 Push Button前提概要API接口给按钮添加图标给按钮添加快捷键 Radio ButtonAPI接口性别选择 Push Button(鼠标点击不放连续移动快捷键) Radio Button Push Button 前提概要 1. 之前文章中所提到的各种跟QWidget有关的各种属性/函数/方法&#…...
【NLP】 38. Agent
什么是 Agent? 一个 Agent 就是能够 理解、思考,并且进行世界交互 的模型系统,并不是纯粹的 prompt 返回器。 它可以: 读取外部数据(文件/API)使用记忆进行上下文维持用类Chain-of-Thought (CoT)方式进行…...
window安装docker\docker-compose
安装前配置 打开控制面板,参照下图打开“启动或关闭windows功能”,Hyper-V 和容器需要启用 程序和功能 启动或关闭windows功能 勾选Hyper-V 安装路径配置 Docker在Windows上的默认安装路径为C:\Program Files\Docker。 以管理员身份运行CMD在D盘,dev文件夹下创建Docker文…...
我爱学算法之—— 前缀和(中)
一、724. 寻找数组的中心下标 题目解析 这道题,给定数组nums,要求我们找出这个数组的中心下标。 **中心下标:**指左侧所有元素的和等于右侧所有元素的和。 如果存在多个中心数组下标,就返回最左侧的中心数组下标。 算法思路 暴…...
