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

news2024/10/7 18:23:36
#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.coloradmin.cn/o/1434162.html

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

相关文章

IP代理在网络中解决了哪些问题?代理IP使用时效是什么意思?

随着互联网的普及和发展&#xff0c;IP代理作为一种网络工具&#xff0c;被广泛应用于各种场景。IP代理的使用可以解决很多网络中的问题&#xff0c;提高网络访问的速度和安全性。本文将详细介绍IP代理在网络中解决的问题&#xff0c;以及代理IP使用时效的含义。 一、IP代理在网…

Backtrader 文档学习-Indicators- TA-Lib

Backtrader 文档学习-Indicators- TA-Lib 1.概述 即使BT提供的内置指标数量已经很多&#xff0c;开发指标主要是定义输入、输出并以自然方式编写公式&#xff0c;还是希望使用TA-LIB。原因: 指标X在指标库中&#xff0c;而不在BT中TA-LIB众所周知的&#xff0c;人们信任口碑…

使用SPM_batch进行批量跑脚本(matlab.m)

软件&#xff1a;spm8matlab2023bwin11 数据格式&#xff1a; F:\ASL\HC\CBF\HC_caishaoqing\CBF.nii F:\ASL\HC\CBF\HC_caishaoqing\T1.nii F:\ASL\HC\CBF\HC_wangdonga\CBF.nii F:\ASL\HC\CBF\HC_wangdonga\T1.nii clear spmdirD:\AnalysisApps\spm8; datadirF:\ASL\HC\CBF…

代理IP使用:如何防范潜在的风险?

代理IP用途无处不在。它们允许您隐藏真实IP地址&#xff0c;从而实现匿名性和隐私保护。这对于保护个人信息、绕过地理受限的内容或访问特定网站都至关重要。 然而&#xff0c;正如任何技术工具一样&#xff0c;代理IP地址也伴随着潜在的风险和威胁。不法分子可能会滥用代理IP…

《合成孔径雷达成像算法与实现》Figure6.5

clc clear close all参数设置 距离向参数设置 R_eta_c 20e3; % 景中心斜距 Tr 2.5e-6; % 发射脉冲时宽 Kr 20e12; % 距离向调频率 alpha_os_r 1.2; % 距离过采样率 Nrg 320; % 距离线采样数 距离向…

上云03 | 数据库事务

文章目录 MySQL线程池禁用存储过程、函数、触发器、视图SQL执行原理执行步骤执行的底层原理详细执行步骤分析**Step 1:获取数据 (From, Join)****Step 2:过滤数据 (Where)****Step 3:分组 (Group by)****Step 4:分组过滤 (Having)****Step 5:返回查询字段 (Select)****Step 6:排…

前端复杂 table 渲染及 excel.js 导出

转载请注明出处&#xff0c;点击此处 查看更多精彩内容 现在我们有一个如图&#xff08;甚至更复杂&#xff09;的表格需要展示到页面上&#xff0c;并提供下载为 excel 文件的功能。 前端表格渲染我们一般会使用 element-ui 等组件库提供的 table 组件&#xff0c;这些组件一般…

C/C++ - 容器list

目录 容器特性 list 容器特性 使用场景 构造函数 默认构造函数 填充构造函数 范围构造函数 复制构造函数 大小函数 函数&#xff1a;size 函数&#xff1a;empty​ 函数&#xff1a;max_size​ 增加函数 函数&#xff1a;​push_back​ 函数&#xff1a;push_f…

Kubernetes 简介

&#x1f4ce;k8s 入门到微服务项目实战.xmindhttps://www.yuque.com/attachments/yuque/0/2024/xmind/35457682/1707117691869-1ea2805d-7218-4223-a0a9-877147ca84b2.xmind 目录 1、概念介绍 应用部署的演变 Kubernetes 架构图 分层架构 2、Kubernetes 组件 控制面板组…

基恩士 KV-8000 PLC通讯简单测试

1、KV-8000通讯协议 基恩士 KV-8000 PLC支持多种通讯方式&#xff0c;包括&#xff1a;OPC UA、Modbus、上位链路命令等。其中OPC UA需要对服务器和全局变量进行设置&#xff0c;Modbus需要调用功能块。默认支持的是上位链路命令&#xff0c;实际是一条条以回车换行结束的ASCII…

vulhub中AppWeb认证绕过漏洞(CVE-2018-8715)

AppWeb是Embedthis Software LLC公司负责开发维护的一个基于GPL开源协议的嵌入式Web Server。他使用C/C来编写&#xff0c;能够运行在几乎先进所有流行的操作系统上。当然他最主要的应用场景还是为嵌入式设备提供Web Application容器。 AppWeb可以进行认证配置&#xff0c;其认…

在bash或脚本中,如何并行执行命令或任务(命令行、parallel、make)

最近要批量解压归档文件和压缩包&#xff0c;所以就想能不能并行执行这些工作。因为tar自身不支持并行解压&#xff0c;但是像make却可以支持生成一些文件&#xff0c;所以我才有了这种想法。 方法有两种&#xff0c;第一种不用安装任何软件或工具&#xff0c;直接bash或其他 …

html2canvas 截图功能使用 VUE

html2canvas 是一个 JavaScript 库&#xff0c;可以将网页内容转换为 Canvas 元素&#xff0c;并生成图像或 PDF 文件。使用 html2canvas&#xff0c;你可以在客户端将网页的内容截图&#xff0c;并将其作为图像或 PDF 文件保存或分享。 以下是一些 html2canvas 库的特点和用途…

C语言笔试题之反转链表(头插法)

实例要求&#xff1a; 1、给定单链表的头节点 head &#xff1b;2、请反转链表&#xff1b;3、最后返回反转后的链表&#xff1b; 案例展示&#xff1a; 实例分析&#xff1a; 1、入参合理性检查&#xff0c;即head ! NULL || head->next ! NULL&#xff1b;2、while循环…

深刻理解树状数组--树状数组构造定义与动态维护区间和的合理性证明

文章目录 一.树状数组概览二.树状数组构造定义lowbit运算树状数组的结点值的定义树状数组结点层次的定义树状数组父子结点关系定义 三.关于树状数组结构的重要证明引理1引理2树状数组模板题 一.树状数组概览 树状数组的下标从1开始标识,其物理结构是线性表,逻辑结构是一颗多叉…

Vue中v-if和v-show区别

Vue中v-if和v-show是两个常用的指令&#xff0c;用于控制元素的显示和隐藏。虽然它们都能达到相同的效果&#xff0c;但在实现机制和使用场景上有一些区别。本文将详细介绍v-if和v-show的区别&#xff0c;并且通过示例代码来演示它们的使用。 首先&#xff0c;让我们来看一下v…

Debezium发布历史110

原文地址&#xff1a; https://debezium.io/blog/2021/09/22/deep-dive-into-a-debezium-community-connector-scylla-cdc-source-connector/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. Debezium 1.7.0.CR2…

世界各国都在追求“主权人工智能能力”,国家级人工智能硬件需求将剧增

NVIDIA的CEO黄仁勋最近在接受媒体采访时指出&#xff0c;世界各国都打算在本国内建立和运行自主的人工智能基础设施&#xff0c;这将全面带动NVIDIA硬件产品需求的飙升。黄仁勋表示&#xff0c;包括印度、日本、法国和加拿大在内的国家政府都在讨论投资“国家主权人工智能能力”…

关于harbor做HA

我起初是用helm在k8s上装的harbor&#xff0c;最近遇到如下故障&#xff1a;就是服务器硬件设备故障突然死机&#xff0c;恰巧是harbor容器所在的服务器&#xff0c;其他在这个服务器上运行的容器&#xff0c;由kubelet调度到其他正常的服务器上重启去了&#xff0c;但harbkor并…

2024.1.26力扣每日一题——边权重均等查询

2024.1.26 题目来源我的题解方法一 使用dfs对每一组查询都求最近公共祖先&#xff08;会超时&#xff0c;通不过&#xff09;方法二 不需要构建图&#xff0c;直接在原始数组上进行求最大公共祖先的操作。 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2846 我的题解 …