通过消息队列实现进程之间通信代码

#include <myhead.h>
struct msgbuf
{
	long int mtype; 
	char mtext[1024]; 
};
//定义一个消息大小
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long int)
int main(int argc, const char *argv[])
{
	//1、创建key值以便创建消息队列
	key_t key = ftok("/", 'k');
	if(key == -1)
	{
		perror("ftok error");
		return -1;
	}
	//2、使用key值,打开一个消息队列
	int msgid;
	if((msgid=msgget(key, IPC_CREAT|0664)) == -1)
	{
		perror("msgget error");
		return -1;
	}
	//创建进程
	pid_t pid;
	pid = fork();
	if(pid <0)
	{
		perror("fork error");
		return -1;
	}else if(pid == 0)
	{
		while(1)
		{
			struct msgbuf buf = {.mtype=1};
			//清空数组
			bzero(buf.mtext, sizeof(buf.mtext));
			//从终端输入数据到正文
			fgets(buf.mtext, sizeof(buf.mtext), stdin);   
			//将'\n'换成'\0'
			buf.mtext[strlen(buf.mtext)-1] = '\0';
			//将数据放入消息队列中
			if(msgsnd(msgid, &buf, MSGSIZE, 0) !=0)
			{
				perror("msgsnd error");
				return -1;
			}
			if(strcmp(buf.mtext,"quit") == 0)
			{
				break;
			}
		}
		exit(EXIT_SUCCESS);
	}else
	{
		//向消息队列中存放数据
		struct msgbuf buf = {.mtype =2};
		while(1)
		{
			//清空数组
			bzero(buf.mtext, sizeof(buf.mtext));
			//从消息队列中读取信息
			if(msgrcv(msgid, &buf, MSGSIZE,2, 0) == -1)
			{
				perror("msgrcv error");
				return -1;
			}
			printf("读取的消息为:%s\n", buf.mtext);
			if(strcmp(buf.mtext,"quit") == 0)
			{
				break;
			}
		}
		//删除消息队列
		if(msgctl(msgid, IPC_RMID, NULL) == -1)
		{
			perror("msgctl error");
			return -1;
		}
		wait(NULL);
	}
	return 0;
}
#include <myhead.h>
struct msgbuf
{
    long int mtype; 
    char mtext[1024]; 
};
//定义一个消息大小
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long int)
int main(int argc, const char *argv[])
{
	//1、创建key值以便创建消息队列
    key_t key = ftok("/", 'k');
    if(key == -1)
    {
        perror("ftok error");
        return -1;
    }
	//2、使用key值,打开一个消息队列
    int msgid;
    if((msgid=msgget(key, IPC_CREAT|0664)) == -1)
    {
        perror("msgget error");
        return -1;
    }
	//创建进程
	pid_t pid;
	pid = fork();
	if(pid <0)
	{
		perror("fork error");
		return -1;
	}else if(pid == 0)
	{
		//定义一个消息变量
    struct msgbuf buf = { .mtype = 1};
    while(1)
    {
        //清空数组
        bzero(buf.mtext, sizeof(buf.mtext));
        //从消息队列中读取信息
        if(msgrcv(msgid, &buf, MSGSIZE, 1, 0) == -1)
        {
            perror("msgrcv error");
            return -1;
        }
        printf("读取的消息为:%s\n", buf.mtext);
        if(strcmp(buf.mtext,"quit") == 0)
        {
            break;
        }
    }
    //删除消息队列
    if(msgctl(msgid, IPC_RMID, NULL) == -1)
    {
        perror("msgctl error");
        return -1;
    }
    exit(EXIT_SUCCESS);
	}else
	{
    while(1)
    {
		struct msgbuf buf = {.mtype=2};
        //清空数组
        bzero(buf.mtext, sizeof(buf.mtext));
		//从终端输入数据到正文
        fgets(buf.mtext, sizeof(buf.mtext), stdin);   
        //将'\n'换成'\0'
        buf.mtext[strlen(buf.mtext)-1] = '\0';
        //将数据放入消息队列中
        if(msgsnd(msgid, &buf, MSGSIZE, 0) !=0)
        {
            perror("msgsnd error");
            return -1;
        }
        if(strcmp(buf.mtext,"quit") == 0)
        {
            break;
        }
    }
    wait(NULL);
	}
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Bootstrap5 图片轮播

Bootstrap5 轮播样式表使用的是CDN资源 <title>亚丁号</title><!-- 自定义样式表 --><link href"static/front/css/front.css" rel"stylesheet" /><!-- 新 Bootstrap5 核心 CSS 文件 --><link rel"stylesheet"…

STM32WLE5JC

Sub-GHz 无线电介绍 sub-GHz无线电是一种超低功耗sub-GHz无线电&#xff0c;工作在150-960MHz ISM频段。 在发送和接收中采用LoRa和&#xff08;G&#xff09;FSK调制&#xff0c;仅在发送中采用BPSK/(G)MSK调制&#xff0c;可以在距离、数据速率和功耗之间实现最佳权衡。 这…

freeswitch对接FunASR实时语音听写

1、镜像启动 通过下述命令拉取并启动FunASR软件包的docker镜像&#xff1a; sudo docker pull \registry.cn-hangzhou.aliyuncs.com/funasr_repo/funasr:funasr-runtime-sdk-online-cpu-0.1.7 mkdir -p ./funasr-runtime-resources/models sudo docker run -p 10096:10095 -i…

【Gephi项目实战-带数据集】利用gephi绘制微博肖战超话120位用户关系图,并计算整体网络指标与节点指标

数据集在评论区&#xff0c;B站演示视频在评论区&#xff01; 简介 最近2天需要用到gephi做社会网络分析&#xff0c;于是从0开始接触gephi并摸索出了gephi的基本使用指南。下面将结合真实的节点文件与边文件&#xff0c;利用gephi绘制社会网络并计算相关测量指标。整个过程会…

我们都是宇宙的奇迹

我们都是独一无二的个体&#xff0c;是宇宙的奇迹 如果我不关注自我&#xff0c;那我在这个宏大的宇宙中有什么意义&#xff1f; 关于你的问题&#xff0c;我想没有一个简单的答案&#xff0c;因为不同的人可能有不同的看法和感受。有些人可能认为&#xff0c;如果不关注自我&…

jbdc的简单了解

JDBC JDBC所处的位置 JDBC的本质 Java操作数据库的一套接口。 补充 ddl:数据库定义语言,例如建表,创建数据库等。 dml:数据库操作语言,例如增删改。 dql:数据库查询语言,例如查询语句。 注意 在创建Java项目后的第一个步骤是导入jar包。 导入jar包的步骤 1 创建l…

【C语言】const修饰指针的不同作用

目录 const修饰变量 const修饰指针变量 ①不用const修饰 ②const放在*的左边 ③const放在*的右边 ④*的左右两边都有const 结论 const修饰变量 变量是可以修改的&#xff0c;如果把变量的地址交给⼀个指针变量&#xff0c;通过指针变量的也可以修改这个变量。 但…

TCP/IP详细介绍以及TCP/IP寻址

目录 ​编辑 1. TCP/IP 介绍 2. 计算机通信协议&#xff08;Computer Communication Protocol&#xff09; 3. 什么是 TCP/IP&#xff1f; 4. 在 TCP/IP 内部 5. TCP 使用固定的连接 6. IP 是无连接的 7. IP 路由器 8. TCP/IP 9. TCP/IP 寻址 10. IP地址 …

LeetCode、1137. 第 N 个泰波那契数【简单,动态规划】

文章目录 前言LeetCode、1137. 第 N 个泰波那契数【简单&#xff0c;动态规划】题目与分类思路一维动态规划 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术…

记录下ibus-libpinyin输入法的重新安装

目前的版本为: 首先把现在的ibus-libpinyin卸了 sudo apt-get --purge remove ibus-libpinyin sudo apt-get autoremove 安装教程请参考 Installation libpinyin/ibus-libpinyin Wiki GitHub yilai sudo apt install pkg-config sudo apt-get install libglib2.0-de…

02-Web应用_架构构建_漏洞_HTTP数据包_代理服务器

Web应用_架构构建_漏洞_HTTP数据包_代理服务器 一、网站搭建前置知识1.1 域名1.2、子域名1.3、DNS二、web应用环境架构类三、web应用安全漏洞分类四、web请求返回过程数据包 五、演示案例5.1、架构-Web应用搭建-域名源码解析5.2、请求包-新闻回帖点赞-重放数据包5.3、请求包-移…

内网远程控制——向日葵

针对向日葵的话其实如果有本地安装的话&#xff0c;是有可能存在漏洞的。这里进行复现 攻击过程&#xff1a; 向日葵&#xff08;不可以攻击&#xff09; 遇到不可以攻击的向日葵&#xff0c;我们也有几种渗透手法&#xff1a; &#xff08;1&#xff09;窃取配置文件来进行解…

【八大排序】选择排序 | 堆排序 + 图文详解!!

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构冒险记 ✅C语言进阶之路 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 文章目录 一、选择排序1.1 基本思想1.2 算法步骤 动图演示1.3 代码实现1.4 选择排序特性总结 二…

【开源】SpringBoot框架开发农村物流配送系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统登录、注册界面2.2 系统功能2.2.1 快递信息管理&#xff1a;2.2.2 位置信息管理&#xff1a;2.2.3 配送人员分配&#xff1a;2.2.4 路线规划&#xff1a;2.2.5 个人中心&#xff1a;2.2.6 退换快递处理&#xff1a;…

Profinet转CANopen主站网关与堡盟编码器通讯案例

Profinet转CANopen主站网关(XD-COPNm20)为CPU与堡盟编码器的通讯提供了CANopen协议向Profinet协议转换互通的桥梁。CANopen是一种基于CAN总线的通讯协议&#xff0c;它被广泛应用于工业自动化领域&#xff0c;而Profinet是一种以太网协议&#xff0c;其优点是高速传输和广泛的可…

前端JavaScript篇之JavaScript为什么要进行变量提升,它导致了什么问题?什么是尾调用,使用尾调用有什么好处?

目录 JavaScript为什么要进行变量提升&#xff0c;它导致了什么问题&#xff1f;总结 什么是尾调用&#xff0c;使用尾调用有什么好处&#xff1f;总结 JavaScript为什么要进行变量提升&#xff0c;它导致了什么问题&#xff1f; 变量提升是JavaScript在代码执行之前对变量和函…

机器学习---半监督学习简单示例(标签传播算法)

1. 使用半监督学习方法 Label Spreading 在一个生成的二维数据集上进行标签传播 import numpy as np import matplotlib.pyplot as plt from sklearn.semi_supervised import label_propagation from sklearn.datasets import make_circles# generate ring with inner box n_s…

vue3中自定义简易版hooks,computed筛选

一、默认computed筛选方式 <template><div><input type"text" v-model"mytext"><ul><li v-for"data in computedList" :key"data">{{data}}</li></ul></div> </template><…

TryHackMe-Net Sec Challenge练习

本文相关的TryHackMe实验房间链接&#xff1a;TryHackMe | Why Subscribe nmap nmap -T5 -p- 10.10.90.32 -T5 扫描速度 -p- 全端口扫描 答题&#xff1a; 这题叫我们找藏在http服务下的flag&#xff0c;根据上面扫出来的端口&#xff0c;所以我们开始搞80 这里简单介绍一下…

EMNLP 2023精选:Text-to-SQL任务的前沿进展(上篇)——正会论文解读

导语 本文记录了今年的自然语言处理国际顶级会议EMNLP 2023中接收的所有与Text-to-SQL相关&#xff08;通过搜索标题关键词查找得到&#xff0c;可能不全&#xff09;的论文&#xff0c;共计12篇&#xff0c;包含5篇正会论文和7篇Findings论文&#xff0c;以下是对这些论文的略…