当前位置: 首页 > news >正文

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…...

扩展学习|数据融合助推商务智能与分析

文献来源&#xff1a;[1]李爱华,续维佳,石勇.基于数据融合的商务智能与分析架构研究[J].计算机科学,2022,49(12):185-194. 一、信息融合 &#xff08;一&#xff09;信息融合定义演变 早期信息融合的定义指出&#xff0c;其主要任务是综合分析若干传感器观测到的信息[9,…...

Java项目:112SSM在线电影订票系统

博主主页&#xff1a;Java旅途 简介&#xff1a;分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 在线电影订票系统基于SpringSpringMVCMybatis开发&#xff0c;系统分为前台和后台&#xff0c;前台主要用来用户浏览电影信息&#xff0c;订票&#xff0c…...

Echarts——使用graphic组件在一个option内同时设置两个饼图的背景图

使用echarts的graphic原生图形元素组件&#xff0c;为两个饼图设置对应背景。 <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属性表示输入类型&#xff0c;后面还跟上其他属性&#xff0c;叫输入属性。 value 属性 value 属性规定输入字段的初始值&#xff1a; <form action"">First name:<…...

请求参数乱码问题

POST请求方式解决乱码问题 在web.xml里面设置编码过滤器 <filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><!-- 设置过滤器中的属性值 -…...

【leetcode】力扣热门之反转链表【简单难度】

题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 用例 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1] 输入&#xff1a;head [] 输出&#xff1a;[…...

【sgPasswordInput】自定义组件:带前端校验密码强度的密码输入框,能够提供密码强度颜色提示和文字提示

特性&#xff1a; 有密码强度颜色提示密码强度进度条提示支持设置默认输入提示和密码长度 sgPasswordInput源码 <template><div :class"$options.name" style"width: 100%"><el-inputstyle"width: 100%"ref"psw"type&…...

1599 - Ideal Path (UVA)

题目链接如下&#xff1a; https://onlinejudge.org/index.php?optioncom_onlinejudge&Itemid8&category448&pageshow_problem&problem4474 这道题也是看了刘汝佳的思路才写出来的.... 代码如下&#xff1a; #include <cstdio> #include <deque&…...

计算机网络(超级详细笔记)

使用教材计算机网络&#xff08;第8版&#xff09;&#xff08;谢希仁&#xff09; 第一章&#xff1a;概述 第二章&#xff1a;物理层 第三章&#xff1a;数据链路层 第四章&#xff1a;网络层 第五章&#xff1a;运输层 第六章&#xff1a;应用层 目…...

老杨说运维 | 年末大讲回顾:运维的尽头也是大模型吗?

哈喽~朋友们&#xff0c;这么快又见面啦。前阵子我们给CEO老杨安排了一场年末大讲&#xff0c;主要是跟大家聊聊智能运维的“智”与“能”以及剖析时下热点----运维大模型。后台收到了不少朋友的反馈&#xff0c;小编看了大受鼓舞并暗下决心----新的一年&#xff0c;希望能多安…...

Unity 利用UGUI之Scrollbar制作进度条

在Unity中除了用Slider、Image做进度条&#xff0c;其实用Scrollbar也可以做进度条。 首先&#xff0c;在场景中新建一个Scrollbar组件和一个Text组件&#xff1a; 其次&#xff0c;创建模拟进度的一个脚本&#xff0c;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导出 导出表数据和表结构 语法&#xff1a; mysqldump -u用…...

【unity小技巧】FPS游戏实现相机的偏移震动、武器射击后退和后坐力效果

最终效果 文章目录 最终效果前言相机偏移震动相机震动脚本换弹节点震动 武器射击后退效果武器后坐力效果完结 前言 关于后坐力之前其实已经分享了一个&#xff1a;FPS游戏后坐力制作思路 但是实现起来比较复杂&#xff0c;如果你只是想要简单的实现&#xff0c;可以看看这个&…...

MINCO+汽车

规划典型的解决方法: 如何准确的描述他的动力学,实际上是对这个物理对象进行建模.(规划等于开环的控制,控制等于闭环的规划),规划系统要做到是假设已知系统模型的情况下去计算一些可能会影响比较好的 未来运动的指令,做未来运动轨迹的推演.对自己建模的情况下还需对环境有个比较…...

大模型机器人发展史:从VoxPoser、RT2到斯坦福Mobile ALOHA、Google机器人

前言 23年7月&#xff0c;我在朋友圈评估Google的RT2说道&#xff1a; “大模型正在革新一切领域啊&#xff0c;超帅&#xff0c;通过大模型不仅能理解“人话”&#xff0c;还能对“人话”进行推理&#xff0c;并转变为机器人能理解的指令&#xff0c;从而分阶段完成任务。回…...

Ubunutu18.04 ROS melodic 无人机 XTDrone PX4 Vins-Fuison 运行配置

一、PX4飞控EKF配置 PX4默认使用的EKF配置为融合GPS的水平位置与气压计高度。如果我们想使用视觉定位&#xff0c;就需要把修改配置文件。让EKF融合来自mavros/vision_pose/pose的数据 1.1修改rcS配置文件 gedit ~/PX4_Firmware/ROMFS/px4fmu_common/init.d-posix/rcS 通过注…...

Linux 常见服务配置

笔记所以内容很多&#xff0c;建议选择性看看 SSH Secure Shell 用于与服务器建立安全的连接 对应服务 sshd 注意&#xff1a;配置文件 配制文件修改需要重启或重载sshd服务才能生效 systemctl sshd reload # 重载 sshd 配置文件 systemctl sshd restart # 重启 ssh…...

Flutter基础

一、关键字 class&#xff1a;用于定义一个新的类&#xff1b; extends: 用于指定一个类继承另一个类&#xff1b; mixin: 用于将一个类的代码片段添加到另一个类中&#xff0c;实现代码复用&#xff1b; abstract: 用于声明一个抽象类或抽象方法&#xff0c;不能直接实例化&a…...

MySQL-数据库概述

数据库相关概念&#xff1a; 数据库(DateBase)简称DB,就是一个存储数据的仓库&#xff0c;数据有组织的进行存储。 数据库分为关系型数据库简称RDBMS和非关系型数据库 关系型数据库简称RDBMS:建立在关系模型的基础上&#xff0c;由多张相互连接的二维表组成的数据库.简单来说…...

AI开发不再卡顿:RTX4090D 24G镜像解决环境冲突全攻略

AI开发不再卡顿&#xff1a;RTX4090D 24G镜像解决环境冲突全攻略 1. 为什么选择RTX4090D 24G深度学习镜像&#xff1f; 深度学习开发者最头疼的问题莫过于环境配置。不同框架版本、CUDA版本、依赖库之间的冲突常常让人望而却步。传统环境搭建方式需要&#xff1a; 手动安装C…...

Janus-Pro-7B实操手册:批量图片理解任务脚本编写与结果结构化导出

Janus-Pro-7B实操手册&#xff1a;批量图片理解任务脚本编写与结果结构化导出 1. 项目背景与需求场景 在日常工作中&#xff0c;我们经常需要处理大量的图片理解任务。比如电商平台需要分析商品图片中的信息&#xff0c;内容审核团队需要识别图片中的违规内容&#xff0c;或者…...

如何通过Superalgos教育模块快速掌握算法交易:新手入门完整指南

如何通过Superalgos教育模块快速掌握算法交易&#xff1a;新手入门完整指南 【免费下载链接】Superalgos Superalgos/Superalgos: 是一个开源的分布式社交网络分析和数据挖掘平台。适合对大数据分析、机器学习、区块链以及分布式系统有兴趣的开发者。 项目地址: https://gitc…...

OpenClaw本地模型成本对比:nanobot镜像vs商业API实测

OpenClaw本地模型成本对比&#xff1a;nanobot镜像vs商业API实测 1. 为什么需要关注OpenClaw的模型成本 上周我在尝试用OpenClaw自动化处理200份PDF文档时&#xff0c;意外发现账单上出现了三位数的API费用。这个数字让我意识到——当OpenClaw需要频繁调用大模型进行决策时&a…...

终极指南:用Java打造你的专属微信机器人 - 深入解析wechat-api框架

终极指南&#xff1a;用Java打造你的专属微信机器人 - 深入解析wechat-api框架 【免费下载链接】wechat-api &#x1f5ef; wechat-api by java7. 项目地址: https://gitcode.com/gh_mirrors/we/wechat-api 想象一下这样的场景&#xff1a;每天早上7点&#xff0c;你的微…...

从零封装一个 Vue 低代码表单组件:我是如何借鉴 FcDesigner 的设计思路的

从零封装一个 Vue 低代码表单组件&#xff1a;我是如何借鉴 FcDesigner 的设计思路的 低代码开发正在改变前端工程师的工作方式。作为一名长期深耕表单领域的前端开发者&#xff0c;我曾参与过多个企业级低代码平台的搭建&#xff0c;也经历过从零开始封装表单组件的完整周期。…...

技术指标——格雷厄姆指数

文章目录1. 格雷厄姆指数是什么&#xff1f;2. 格雷厄姆指数的作用是什么&#xff1f;3. 举例计算例1&#xff1a;牛市顶部&#xff08;2021年2月&#xff09;例2&#xff1a;熊市底部&#xff08;2024年2月&#xff09;例3&#xff1a;中性水平&#xff08;假设某一般时刻&…...

DSP28335串口调试:从printf重定向到稳定数据输出的实战解析

1. 为什么需要printf重定向&#xff1f; 在DSP28335开发过程中&#xff0c;printf函数是我们最常用的调试工具之一。想象一下&#xff0c;当你需要实时查看算法运行状态、变量数值或者系统日志时&#xff0c;如果每次都要停下来用调试器查看&#xff0c;那效率得多低啊&#xf…...

OpenClaw开发辅助:Qwen3.5-9B实现日志分析与错误自动修复

OpenClaw开发辅助&#xff1a;Qwen3.5-9B实现日志分析与错误自动修复 1. 为什么需要AI辅助日志分析&#xff1f; 每次凌晨被报警短信吵醒&#xff0c;盯着密密麻麻的日志文件找异常时&#xff0c;我都会想&#xff1a;如果能有个AI助手帮我自动分析日志、定位问题甚至尝试修复…...

基于MATLAB的数字图像处理系统:预处理、特征提取与语义分割全流程实现

数字图像处理系统&#xff08;基于matlab&#xff09; 此系统包括预处理&#xff0c;特征提取&#xff0c;语义分割 使用机器学习算法knn和svm 预处理包括线性灰度级变化&#xff0c;指数灰度级变化&#xff0c;直方图均衡化&#xff0c;高斯滤波&#xff0c;中值滤波&#xff…...