消息队列实现从一个进程向另一个进程发送一个数据块的方法

2023-05-16

首先是Comm.h的代码

#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#define SERVER_TYPE 1
#define CLIENT_TYPE 2
#define SIZE 128
#define PATHNAME "."
#define PROJ_ID 0x666
struct msgbuf{
 long mtype;
 char mtext[SIZE];
};
int CommMsgQueue(int mgflg);
int CreateMsgQueue();
int GetMsgQueue();

int SendMsg(int msgid, long type, const char *_info);
int RecvMsg();
int DestroyMsgQueue(int msgid);
#endif

Comm.c的代码

#include"Comm.h"
int CommMsgQueue(int msgflg){
 key_t key = ftok(PATHNAME,PROJ_ID);//gets key
 if(key < 0)//failed
 {
  perror("ftok");
  return -1;
 }
 int mspid = msgget(key,msgflg);
    if(mspid < 0)//failed return -1
 {
  perror("msgget");
  return -2;
 }
 return mspid;//success return mspid
}
int CreateMsgQueue()
{
 return CommMsgQueue(IPC_CREAT | IPC_EXCL | 0666);//must new
}
int GetMsgQueue()
{
 return CommMsgQueue(IPC_CREAT);//return has been created
}
int SendMsg(int msgid, long type, const char *_info)
{
 struct msgbuf msg;
 msg.mtype = type;
 strcpy(msg.mtext, _info);
 if(msgsnd(msgid,&msg,sizeof(msg.mtext),0) < 0)
 {
  perror("msgsnd");
  return -1;
 }
 return 0;
}
int RecvMsg(int msgid,long type, char out[])
{
 struct msgbuf msg;
 if(msgrcv(msgid,&msg,sizeof(msg.mtext),type,0) < 0)
 {
  perror("msgrcv");
  return -1;
 }
 strcpy(out,msg.mtext);
 return 0;
}
int DestroyMsgQueue(int msgid)
{
 if(msgctl(msgid, IPC_RMID, NULL) < 0)
 {
  perror("msgctl");
  return -1;
 }
 return 0;//success
}


所有的接口已经实现完毕,现在我们分别实现通信双方的代码

首先是server.c

#include"Comm.h"
int main()
{
 int msgid = CreateMsgQueue();
 printf("msgid: %d\n",msgid);
 char buf[SIZE];
 while(1)
 {
  RecvMsg(msgid,CLIENT_TYPE,buf);
  printf("client# %s\n",buf);
  printf("Please Entry:");
  fflush(stdout);
  ssize_t _s = read(0,buf,sizeof(buf)-1);
  if(_s > 0)
  {
   buf[_s-1] = '\0';
   SendMsg (msgid,SERVER_TYPE,buf);
  }
 }
    DestroyMsgQueue(msgid);
}



接着是client.c

#include"Comm.h"
int main()
{
 int msgid = GetMsgQueue();
 printf("msgid: %d\n",msgid);
 char buf[SIZE];
 while(1)
 {
  printf("Please Entry:");
  fflush(stdout);
  ssize_t _s = read(0,buf,sizeof(buf)-1);
  if(_s > 0)
  {
   buf[_s-1] = '\0';
  }
  SendMsg (msgid,CLIENT_TYPE,buf);
  RecvMsg(msgid,SERVER_TYPE,buf);
  printf("client# %s\n",buf);
 }
}

最后我们来看看makefile文件的编写
​​在这里插入图片描述
最后我们来看看结果吧

在这里插入图片描述

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

消息队列实现从一个进程向另一个进程发送一个数据块的方法 的相关文章

  • PID参数设定

    在电机的控制领域 xff0c 不同的电机有不同的驱动方式 xff0c 其中应用最广泛的就是PID proportion integration differentiation 控制 P I和D分别指比例控制 xff0c 积分控制和微分控制
  • 系统编程__2__父子进程的创建和回收

    系统编程 这里写的是对于小白来说更多的了解系统编程的文章 xff0c 有写的不对的地方还恳请各位大佬指出错误 xff0c 小编一定会多多采纳 手动多谢 那么 xff0c 上一次我们稍微了解了一下关于系统编程的一些主要内容 没有看到的童鞋还请
  • php解决跨域访问

    php跨域问题解决判断 参考文章 xff1a php跨域 xff1a https blog csdn net ouxiaoxian article details 89332027 预检请求是什么 xff1a https www jians
  • 动态库与静态库的区别是什么

    区别 xff1a 1 静态库的扩展名一般为 a 或 lib xff1b 动态库的扩展名一般为 so 或 dll 2 静态库在编译时会直接整合到目标程序中 xff0c 编译成功的可执行文件可独立运行 xff1b 动态库在编译时不会放到连接的目
  • Ubuntu 使用 du 查看某个文件夹大小

    在 Ubuntu 系统中 xff0c 你可以使用 du 命令来查看文件夹的大小 例如 xff0c 如果你想查看文件夹 var log 的大小 xff0c 你可以使用如下的命令 xff1a du sh var log 其中 xff0c s 选
  • 无人机六旋翼数学建模[matlab-simulink]

    写在前面 xff0c 这篇文章是借鉴Drexel University 的Senior Design project的matlab simulink四旋翼模型 xff0c 在此基础上针对六旋翼进行的基本改进 xff0c 这里只对 43 型模
  • stm32连接DHT11温湿度传感器

    目录 1 DHT11简介 1 1 连接电路 1 2 串行接口 单线双向 2 cubeMX设置 3 代码开发 3 1 实现定时函数 3 2 打开串口调试 3 4 测试代码实现 4 运行效果 1 DHT11简介 1 1 连接电路 信息如下 xf
  • STM32CubeMX 真的不要太好用

    STM32CubeMX 真的不要太好用 由于工作内容的变动 xff0c 我已经很久没有正经的玩过单片机了 xff0c 近期又要用它做个小玩意了 xff0c 还是选 stm32 吧 xff0c 外设库开发不要太方便 xff0c 哈哈哈 先去
  • ESP-Drone控制板设计的第二个任务-绘制USB-TTL串口下载电路和ESP32-S2芯片内置USB接口电路

    1 摘要 ESP32系列处理器一般会需要采用串口来下载代码 xff0c 因此在其设计中都会保留一个USB TTL串口电路 xff0c 查看乐鑫官网的参考设计 xff0c 基本上是采用CP2102这颗USB转TTL串口芯片 xff0c 但在本
  • Airflow ETL任务调度工具 介绍

    Airflow 是 Apache 基金会的一套用于创建 管理和监控工作流程的开源平台 xff0c 是一套非常优秀的任务调度工具 截至2022年7月 xff0c 在GitHub上已经拥有近27k的star 本文主要介绍一下Airflow 2
  • Data_web(八)mysql增量同步到mongodb

    1 mongdb连接 连接方式如下 xff08 重要 xff01 xff01 xff01 xff01 xff0c 账号密码必须建立在db下面 xff0c 如果默认再admin下面 xff0c 导致无法切换库 xff0c 连接报错 xff09
  • 2021电子设计竞赛飞控视觉之openmv寻找方格中心

    写在前面 这是我在电赛飞控备赛期间写的一个小函数 xff0c 功能是寻找目标点所在方格的中心 这样四旋翼在方格地图上移动一定距离之后就可以使用openmv将四旋翼辅助定位至目前所在方格的中心 今年G题刚出来的时候本来以为能用上这个函数进行辅
  • centos6.5vim基本配置

    简单的vim配置 xff1a 在目录 etc 下面 xff0c 有个名为vimrc的文件 xff0c 这是系统中公共的vim配置文件 xff0c 对所有用户都有效 而在每个用户的主目录下 xff0c 都可以自己建立私有的配置文件 xff0c
  • atexit注册函数

    函数名 atexit 头文件 include lt stdlib h gt 功 能 注册终止函数 即main执行结束后调用的函数 用 法 int atexit void func void 注意 xff1a 按照ISO C的规定 xff0c
  • Linux管道的容量大小及管道的数据结构

    一 管道容量 xff1a 我们通过ulimit a 命令查看到的pipo size定义的是内核管道缓冲区的大小 xff0c 这个值的大小是由内核设定的 xff1b 而pipe capacity指的是管道的最大值 xff0c 即容量 xff0
  • 线程初体验

    线程的概念 xff1a 线程是一个进程地址空间的一个控制流程 xff0c 是调度的基本单位 xff0c 由于同一进程的多个线程共享同一地址空间 因此Text Segment Data Segment都是共享的 如果定义一个函数 在各线程中都
  • 死锁的四个必要条件

    死锁产生的四个必要条件 互斥条件 xff1a 资源是独占的且排他使用 xff0c 进程互斥使用资源 xff0c 即任意时刻一个资源只能给一个进程使用 xff0c 其他进程若申请一个资源 xff0c 而该资源被另一进程占有时 xff0c 则申
  • 线程安全与可重入函数的区别

    线程安全 xff1a 一般来讲就是一个代码块被多个并发线程反复调用时会一直产生正确的结果 如何确保线程安全 xff1a 确保线程安全 主要 考虑线程之间共享变量的安全 xff0c 每个线程私有的内容包括 xff1a 线程id xff0c e
  • Linux模拟实现sleep

    工作原理 linux中的sleep函数能够让程序休眠一定的秒数 xff0c 到时间后自动恢复运行 实现思路 设定睡眠的秒数 睡眠 xff08 挂起 xff09 恢复运行实现机制 设定睡眠的秒数 xff1a 采用alarm 函数设定需要睡眠的

随机推荐

  • 基于ESP32C3处理器创建Hello World工程-并使用OpenOCD进行Debug

    1 编程环境 1 1 硬件 序号 名称 描述 备注 1 ESP C3 12F KIT 深圳安信可开发的基于其自家ESP C3 12F模块的开发板 淘宝购买 2 ESP Prog 乐鑫官方推出基于FT2232HL接口芯片的JTAG调试器 淘宝
  • 平衡二叉树旋转详解

    平衡二叉树的定义 xff08 AVL xff09 定义 平衡二叉树或者是一棵空树 xff0c 或者满足以下的性质 xff1a 它的左子树和右子树的高度之差的绝对值不超过1 xff0c 并且左子树和右子树也是一个平衡二叉树 平衡因子 左子树高
  • Linux进程组,作业,会话,作业控制详解

    进程组 xff08 1 xff09 每个进程除了有一个进程id之外还属于进程组 xff0c 进程组是一个或者多个进程的集合 xff0c 通常 xff0c 他们与同一作业相关联 xff0c 可以接收来自同一终端的各种信号 xff08 2 xf
  • 如何写一个linux精灵进程

    什么是精灵进程 精灵进程也称守护进程 xff08 Daemon xff09 xff1a 是运行在后台的一种特殊进程 xff0c 它独立于控制终端并周期性的执行某种任务 xff0c 或等待处理某些发生的事件 Linux大多数服务器就是用精灵进
  • TCP的四种定时器

    TCP使用的四种定时器 xff08 Timer xff09 重传计时器 xff08 Retransmission Timer xff09 坚持计时器 xff08 Persistent Timer xff09 保活计时器 xff08 keep
  • Linux进程池与线程池以及线程池的简单实现

    通过动态创建子进程 xff08 或者子线程 xff09 来实现并发服务器的 这样做有如下缺点 xff1a 1 动态创建进程 xff08 或线程 xff09 是比较耗费时间的 xff0c 这将导致较慢的客户响应 2 动态创建的子进程 xff0
  • linux下vim中多行注释和删除多行注释

    多行注释 xff1a a 按下Ctrl 43 v xff0c 进入列模式 b 在行首选择需要注释的行 c 按下 I xff0c 进入插入模式 xff1b d 然后输入注释符 xff08 等 xff09 e 按下 Esc 键 删除多行注释 x
  • socket编程以及select、epoll、poll示例详解

    socket编程 socket这个词可以表示很多概念 xff0c 在TCP IP协议中 IP地址 43 TCP或UDP端口号 唯一标识网络通讯中的一个进程 xff0c IP 43 端口号 就称为socket 在TCP协议中 xff0c 建立
  • 命令替换的两种方式$()和``

    命令替换的含义 命令替换是指将命令的输出作为命令替换的位置的文本 命令替换的一般作用是抽取一个命令的输出 然后使用 61 操作赋值到一个变量供以后使用 命令替换的两种方式 1 反引号 xff0c 电脑键盘Esc下面的那个键 使用如下图 xf
  • Linux中eval命令

    eval命令的作用 eval命令会首先扫描命令进行所有的替换 xff0c 然后在执行所有的命令 xff0c 该命令适用于那些一次扫描无法实现其功能的变量 xff0c 该命令对变量进行两次扫描 xff0c 这些需要进行两次扫描的变量被称为复杂
  • Shell脚本实现带颜色进度条

    最近刚刚学习啦shell脚本的编程方法 xff0c 就采用shell脚本实现了一个带颜色的进度条 xff0c 下面将结果展示给大家 程序结果 实现这个其实非常的简单 xff0c 只需要了解一些基本的语法就可以了 进度条的实现就是循环加输出格
  • KiCAD绘制原理图的几个常用的操作之一

    摘要 在绘制原理图的的过程中 xff0c 会用到很多的操作功能 xff0c 今天就介绍几个在绘制原理图时必须要用到的几个功能 xff1a 1 放置原理图符号 xff1b 2 放置电源符号 xff1b 3 绘制器件引脚之间的连线 xff1b
  • linux中crond服务与crontab用法详解

    crond服务 crond服务是一种守护进程 xff0c 用来定期执行程序 xff0c 安装完成系统之后 xff0c 默认便会启动此任务调度命令 crond命令每分钟会定期检查是否有要执行的工作 xff0c 如果有要执行的工作便会自动执行该
  • shell字符串截取方法

    运算符截取 1 和 截取字符串 xff08 删左边留右边 xff09 下面我们先看代码和运行结果 解释 xff1a span class hljs keyword var span span class hljs keyword strin
  • 面试题:判断一个节点是否在一棵二叉树中

    题目 xff1a 判断一个节点是否在一棵二叉树中 结点定义如下 span class hljs keyword struct span BinaryTree BinaryTree span class hljs keyword char s
  • shell脚本实现希尔(shell)排序

    题目 xff1a 采用shell脚本实现希尔排序 最近刚刚学习啦shell脚本编程 xff0c 因此写了一个简单的希尔排序 span class hljs shebang bin bash span arr 61 span class hl
  • Linux小项目-群聊系统

    项目名称 xff1a chat room群聊系统背景知识与主要技术 xff1a 熟悉Linux基本指令的使用 xff08 ls cd make mkdir top basename pwd cp mv rm touch xff09 熟悉li
  • 求先递增在递减数组中的最大值

    题目 xff1a 一个数组先从小到大递增在从大到小递减 xff0c 找出数组的最大值 思路 xff1a 可以依次遍历整个数组如果array i 满足array i gt array i 1 amp amp array i gt array
  • 哈希(HASH)冲突的处理方法

    通过构造良好的哈希函数可以减少冲突 xff0c 但一般不能完全避免冲突 因此解决冲突是哈希法的另一个关键问题 常用的解决冲突方法有以下四种 开放地址法 这种方法也称再散列法 xff0c 基本思想是当关键字key的哈希地址p 61 H key
  • 消息队列实现从一个进程向另一个进程发送一个数据块的方法

    首先是Comm h的代码 include lt stdio h gt include lt string h gt include lt sys types h gt include lt sys ipc h gt include lt s