IO / day07 作业

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

代码

#include <myhead.h>

//define a msg struct type
struct msgbuf
{
	long mtype; //消息类型
	char mtext[1024]; //消息正文大小

};

//macro msg size
#define SIZE (sizeof(struct msgbuf)-sizeof(long))

int recv(int mtype_recv)
{
	//*-----snd-----	

	//1. create key
	key_t key = ftok("/", 'k');
	if(key==-1)
	{
		perror("error");
		return -1;
	}

	printf("key=%#x\n", key);
	
	//2. create msg queue
	int msgid = msgget(key, IPC_CREAT | 0664);
	if(msgid == -1)
	{
		perror("msgget error");
		return -1;
	}

	printf("msgid=%d\n", msgid);


	//3. send msg to msg queue
	//define a msg var
	struct msgbuf buf;

	while(1)
	{

		//将消息从消息队列读取
		msgrcv(msgid, &buf, SIZE, mtype_recv, 0 );
		//param1: msg queue id
		//param2; buffer start address
		//param3: msg text size
		//param4: msg type
		//param5: if block, 0--> block; 

		printf("recv msg=%s\n", buf.mtext);

		//
		if(strcmp(buf.mtext, "quit") == 0)
		{
			break;
			
		}
	}

	//4. delete msg queue
      if ((msgctl(msgid, IPC_RMID, NULL)) == -1)
      {
          perror("msgctl error");
          return -1;
      }  

}

void* task_recv(void* arg)
{
	int *pmtype_recv = (int *)arg;
	recv(*pmtype_recv);
}




int main(int argc, const char *argv[])
{

	int mtype_snd = 0;
	int mtype_recv = 0;

	printf("plesae input msg type for sender:\n>");
	scanf("%d", &mtype_snd );

	printf("plesae input msg type for receiver:\n>");
	scanf("%d", &mtype_recv );

	int *pmtype_recv = &mtype_recv;


	pthread_t tid = -1;
	int res = pthread_create(&tid, NULL, task_recv, (void *)pmtype_recv );
	if(res !=0 )
	{
		printf("thread create error\n");
		return -1;
	}

	//*-----snd-----	

	//1. create key
	key_t key = ftok("/", 'k');
	if(key==-1)
	{
		perror("error");
		return -1;
	}

	printf("key=%#x\n", key);
	
	//2. create msg queue
	int msgid = msgget(key, IPC_CREAT | 0664);
	if(msgid == -1)
	{
		perror("msgget error");
		return -1;
	}

	printf("msgid=%d\n", msgid);


	//3. send msg to msg queue
	//define a msg var
	struct msgbuf buf;
	buf.mtype = mtype_snd;

	while(1)
	{

		printf("please input msg to send:");
		scanf("%s", buf.mtext);

		//将消息从消息队列读取
		msgsnd(msgid, &buf, SIZE, 0 );
		//param1: msg queue id
		//param2; buffer start address
		//param3: msg text
		//param4: if block, 0--> block; 
		printf("recv msg=%s\n", buf.mtext);

		//
		if(strcmp(buf.mtext, "quit") == 0)
		{
			break;
			
		}
	}

	//4. delete msg queue
      if ((msgctl(msgid, IPC_RMID, NULL)) == -1)
      {
          perror("msgctl error");
          return -1;
      }    	
	return 0;
}

运行结果

2. 思维导图

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

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

相关文章

Vue学习计划-Vue2--VueCLi(三)ref属性、mixins混入、插件、scoped样式

1. ref属性 被用来给元素或子组件注册引用信息&#xff08;id的替代者&#xff09;应用在html标签上获取的是真实DOM元素&#xff0c;应用在组件标签上是组件实例对象&#xff08;VC&#xff08;VueComponent&#xff09;&#xff09;使用方式&#xff1a; 打标识<h1 ref&q…

火山引擎边缘计算用硬核助力赛事直播

经过一个多月激烈争夺&#xff0c;2023英雄联盟全球总决赛终于在11月19日落下帷幕。精彩的对决和高热话题使得直播平台观赛人数暴增&#xff0c;给直播平台稳定性和资源储备提出了巨大的考验。

macosx dbeaver执行脚本报错提示:还没有设置连接地址

1.原因 因为你本地没有安装MySql Client所以按照网上其他操作办法你找不到MySql的客户端&#xff0c;因此配置客户端的时候自然就找不到对应的文件. 2.解决办法 参考DBeaver提供的解决办法&#xff1a; https://dbeaver.com/docs/dbeaver/Local-Client-Configuration/#local…

【复杂网络建模】——基于Graph Convolutional Networks (GCN)进行链接预测

目录 一、复杂网络建模 二、图嵌入方法&#xff08;Graph Convolutional Networks (GCN) &#xff09; 1. 图表示&#xff1a; 2. 邻接矩阵&#xff08;Adjacency Matrix&#xff09;&#xff1a; 3. 图卷积层&#xff08;Graph Convolutional Layer&#xff09;&#xff…

docker的资源控制:

docker的资源控制&#xff1a; 对容器的使用宿主机的资源进行限制 cpu 内存 磁盘i/0 docker使用linux自带的功能cgroup control grouos是linux内核系统提供的一种可以限制&#xff0c;记录&#xff0c;隔离进程所使用的物理资源 control grouos是linux内核系统提供的一种可…

【动态规划】03斐波那契数列模型_最小花费爬楼梯_C++(easy1)

题目链接&#xff1a;leetcode使用最小花费爬楼梯 目录 题目解析&#xff1a; 算法原理 1.状态表示 2.状态转移方程 3.初始化 4.填表顺序 5.返回值 编写代码 题目解析&#xff1a; 题目让我们求达到楼梯顶部的最低花费. 由题可得&#xff1a; cost[i] 是从楼梯第 i 个…

【LeetCode刷题-树】--113.路径总和II

113.路径总和II 方法一&#xff1a;深度优先搜素 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeN…

语音识别功能测试:90%问题,可以通过技术解决

现在市面上的智能电子产品千千万&#xff0c;为了达到人们使用更加方便的目的&#xff0c;很多智能产品都开发了语音识别功能&#xff0c;用来语音唤醒进行交互&#xff1b;另外&#xff0c;各大公司也开发出来了各种智能语音机器人&#xff0c;比如小米公司的“小爱”&#xf…

少儿编程考级:激发孩子逻辑思维能力的关键

在当今信息化时代&#xff0c;少儿编程已经成为孩子们不可或缺的一项技能。而少儿编程考级&#xff0c;则是检验孩子们在这一技能上所取得的成就的重要途径。少儿编程考级不仅能够激发孩子们的逻辑思维能力&#xff0c;还能够提高他们的动手能力和创造力。6547网将详细介绍少儿…

Windows Terminal的半透明效果

打开Windows Terminal的半透明效果 最终实现效果&#xff1a; 系统&#xff1a;win11 23H2 步骤&#xff1a; 1.winx打开终端 2.右键打开设置 3.打开外观->亚克力材料开启 4.默认值->外观->透明度&#xff0c;按喜好选择即可

使用opengl编写shader出现错误,提示无法创建片段shader,且提示:too much data in type constructor

最近在学opengl&#xff0c;在编写片段shader时&#xff0c;编译出现错误如下&#xff1a; 造成这个问题的原因是fragment shader的代码有问题&#xff0c;在创建片段着色器代码的第七行需要传入一些参数&#xff0c;如果传入参数的个数超过了规定值&#xff0c;就会报错。 解…

springboot 极简案例

安装idea File -> New Project 选择依赖 创建controller文件 输入controller类名 输入代码 运行项目 访问 localhost:8080/hello/boot package com.example.demo;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.…

使用 VSCode 开发 Golang 代码,并支持 debug断点调试

背景 Go 自2012年发布至今&#xff0c;由于其出色的性能与并发处理能力&#xff0c;已经被各大互联网公司应用到成熟的产品服务上&#xff0c;目前本人从事项目的后端服务已经从Python全部切换到Go。 于是决定跟后端大佬系统的学习一下Golang语言&#xff0c;然后将自己学习过…

day3_qt

完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&#xf…

用户登录权限

文章目录 [TOC](文章目录) 前言一、鉴权二、 Cookie与session1.HTTP无状态2.cookie的重要属性3.cookie 和 session 的生命周期3.1 cookie 生命周期影响因素3.2 session 生命周期影响因素 4.cookie 和 session 的区别5.工作原理3 用户登录Node.js和Express验证session 三、JSON …

亿胜盈科ATR2037 无限射频前端低噪声放大器

亿胜盈科ATR2037 是一款应用于无线通信射频前端&#xff0c;工作频段为 0.7 到 6GHz 的超低噪声放大器。 ATR2037 低噪声放大器采用先进的 GaAs pHEMT 工艺设计和制作&#xff0c;ATR2037 低噪声放大器在整个工作频段内可以获得非常好的射频性能超低噪声系数。 亿胜盈科ATR203…

QML与C++之间自定义对象输出

1.定义暴露的C类 Message.h #ifndef MESSAGE_H #define MESSAGE_H#include "QObject" #include "MessageAuthor.h"class Message : public QObject {Q_OBJECTQ_PROPERTY(MessageAuthor* author READ author )public:explicit Message(QObject *parent nu…

多线程案例-阻塞队列

阻塞队列是什么 阻塞队列是一种特殊的队列.也遵循"先进先出"的原则 阻塞队列能是一种线程安全的数据结构,并且具有以下特性: 当队列满的时候,继续入队列就会阻塞,直到有其他线程从队列中取走元素. 当队列空的时候,继续出队列也会阻塞,直到有其他线程往队列中插入元素…

LinuxC中进程通信

LinuxC中进程通信 信号&#xff08;Signals&#xff09;&#xff1a;Linux 提供了信号机制&#xff0c;允许一个进程向另一个进程发送信号以通知特定事件的发生。这是一种轻量级的通信机制&#xff0c;通常用于处理异步事件。您可以使用 kill 命令或 kill 函数来发送信号&…

day16_java多线程(入门了解)

多线程入门 一、线程和进程 进程 进程&#xff1a;是指一个内存中运行的应用程序&#xff0c;每个进程都有一个独立的内存空间和系统资源&#xff0c;一个应用程序可以同时运行多个进程&#xff1b;进程也是程序的一次执行过程&#xff0c;是系统运行程序的基本单位&#xff1…