2024.2.23 IO进程线程信号通道

思维导图

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

#include <myhead.h>	//定义一个消息类型
struct msgbuf
{long mtype;//消息类型char mtext[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("ftok 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 =%d\n",msqid);pid_t pid=fork();//创建子进程if(pid>0)//父进程{struct msgbuf sbuf;sbuf.mtype=1;while(1){bzero(sbuf.mtext,sizeof(sbuf.mtext));//清空容器fgets(sbuf.mtext,sizeof(sbuf.mtext),stdin);//从终端获取消息正文sbuf.mtext[strlen(sbuf.mtext)-1]=0;//向消息队列中存放消息msgsnd(msqid,&sbuf,MSGSIZE,0);printf("usr1发送成功\n");if(strcmp(sbuf.mtext,"end")==0){kill(pid,SIGKILL);break;}}wait(NULL);}else if(pid==0)//子进程{struct msgbuf rbuf;while(1){bzero(rbuf.mtext,sizeof(rbuf.mtext));//清空容器//从消息队列中获取类型为2一个消息msgrcv(msqid,&rbuf,MSGSIZE,2,0);printf("收到的消息是类型%ld中的消息:%s\n",rbuf.mtype,rbuf.mtext);if(strcmp(rbuf.mtext,"end")==0){kill(getppid(),SIGKILL);break;}}exit(EXIT_SUCCESS);}else{perror("fork error");return -1;}return 0;
}
#include <myhead.h>	
///定义信号处理函数
void handler(int signo)
{if(signo == SIGCHLD){		wait(NULL);exit(EXIT_SUCCESS);}
}
//定义一个消息类型
struct msgbuf
{long mtype;//消息类型char mtext[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("ftok 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 =%d\n",msqid);	struct msgbuf rbuf;	struct msgbuf sbuf;sbuf.mtype=2;pid_t pid=fork();//创建进程if(pid>0)//父进程{signal(SIGCHLD,handler);while(1){bzero(sbuf.mtext,sizeof(sbuf.mtext));//清空容器fgets(sbuf.mtext,sizeof(sbuf.mtext),stdin);//从终端获取消息正文sbuf.mtext[strlen(sbuf.mtext)-1]=0;//向消息队列中存放消息:msgsnd(msqid,&sbuf,MSGSIZE,0);printf("usr2发送成功\n");if(strcmp(sbuf.mtext,"end")==0) {kill(pid,SIGKILL);break;}}	}else if(pid==0)//子进程{while(1){bzero(rbuf.mtext,sizeof(rbuf.mtext));//清空容器//从消息队列中获取类型为1一个消息msgrcv(msqid,&rbuf,MSGSIZE,1,0);printf("usr2收到的消息是类型%ld中的消息:%s\n",rbuf.mtype,rbuf.mtext);if(strcmp(rbuf.mtext,"end")==0){break;}}//删除消息队列if(msgctl(msqid,IPC_RMID,NULL)!=0){perror("msgctl error");return -1;}exit(EXIT_SUCCESS);}else{perror("fork error");return -1;}return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

INI 格式配置文件基础知识

前言 INI是英文“初始化”&#xff08;initialization&#xff09;的缩写&#xff0c;它是某些平台或软件上的配置文件的非正式标准&#xff0c;以节(section)和键(key)构成&#xff0c;常用于微软Windows操作系统中&#xff0c;这种配置文件的文件扩展名多为INI。INI文件被用来…

第十四章 Linux面试题

第十四章 Linux面试题 日志t.log(访问量)&#xff0c; 将各个ip地址截取&#xff0c;并统计出现次数&#xff0c;并按从大到小排序(腾 讯) http://192. 168200.10/index1.html http://192. 168.200. 10/index2.html http:/192. 168 200.20/index1 html http://192. 168 200.30/…

自定义神经网络四之编写自定义神经网络

文章目录 前言神经网络组件代码整体的项目结构Tensor张量Layers层NeuralNet神经网络Loss损失函数Optim优化器data数据处理train训练 神经网络解决实际问题实际问题训练和推理代码 总结 前言 自定义神经网络一之Tensor和神经网络 自定义神经网络二之模型训练推理 自定义神经网络…

MySQL多实例与Mycat分布式读写分离的架构实践

文章目录 1.Mycat读写分离分布式架构规划2.在两台服务器中搭建八个MySQL实例2.1.安装MySQL软件2.2.创建每个MySQL实例的数据目录并初始化2.3.准备每个实例的配置文件2.4.准备每个实例的启动脚本2.6启动每台机器的MySQL多实例2.7.为每个MySQL实例设置密码2.8.查看每个MySQL实例的…

力扣细节题:翻转二叉树

细节一&#xff1a;递归采用前序递归 细节二&#xff1a;采用交换节点而不是交换数据因为左右树交换的同时左右树的所有子节点都要交换 细节三&#xff1a;采用外置函数因为return如果在本函数内操作会存在必须返回空指针的问题 /*** Definition for a binary tree node.* s…

SpringBoot:数据访问-整合 spring-boot-starter-data-jpa

点击查看数据访问demo&#xff1a;LearnSpringBoot06DataJPA Spring Data JPA - Reference 文档 简介 Spring Data的JPA模块包含一个允许定义存储库bean的自定义名称空间。它还包含JPA特有的某些特性和元素属性。通常&#xff0c;可以使用repositories元素来设置JPA存储库: 点…

【JVM】聊聊JVM生产环境常见的OOM问题

对于JVM来说&#xff0c;因为划分有固定的区域来执行字节码文件&#xff0c;无外乎&#xff0c;出问题的&#xff0c;也就是按照对应分分区会有常见的OOM问题。 栈 对于栈来说&#xff0c;栈的主要作用就是用于方法的执行&#xff0c;方法调用入栈、方法调出出栈。但是如果我…

速卖通买家号操作指南:轻松注册与全自动批量注册技巧

我是一位在速卖通平台销售产品的卖家&#xff0c;最近尝试了一种新的方法来提升产品的销量和曝光度&#xff0c;即利用速卖通买家号以及速卖通跨境智星的功能。我想与大家分享一下我的经验和感受。 首先&#xff0c;我了解到速卖通买家号可以帮助产品在平台上提升排名&#xff…

stable diffusion学习笔记 手部修复

图片手部修复原理 某张图片在生成后&#xff0c;仅有手部表现不符合预期&#xff08;多指&#xff0c;畸形等&#xff09;。这种情况下我们通常使用【局部重绘】的方式对该图片的手部进行【图生图】操作&#xff0c;重新绘制手部区域。 但是仅采用重绘的方式也很难保证生成的…

逆向茶话会笔记

安卓逆向 用用burp设置代理或者用charles抓包 windows httpopen 类比web站点渗透测试 推荐书 飞虫 安卓大佬不怎么打ctf 喜欢在看雪和吾爱破解 提问环节 q websocket grpc抓包有什么推荐的工具&#xff1f; a 不太了解 游戏安全和llvm 既要逆游戏也要逆外挂 逆游戏入…

Linux基础命令—进程管理

基础知识 linux进程管理 什么是进程 开发写代码->代码运行起来->进程 运行起来的程序叫做进程程序与进程区别 1.程序是一个静态的概念,主要是指令集和数据的结合,可以长期存放在操作系统中 2.进程是一个动态的概念,主要是程序的运行状态,进程存在生命周期,生命周期结…

10分钟快速开始SkyWalking结合Springboot项目

10分钟快速开始SkyWalking结合Springboot项目 实习期间&#xff0c;公司让我去学习一下链路追踪如何集成到Springboot项目中。 为此有两个方案&#xff1a; 1.opentelementryjaegerprometheus opentelementry 收集器收集线上的metrics和traces&#xff0c;然后发送给jaeger和p…