目录

  • 一 回顾
  • 二 消息队列的单工通信
  • 三 消息队列的半双工通信

一 回顾

1 通过 fgets函数实现输入指令
2 再通过 msgnsd 函数读取 值
3 最后通过 msgrcv函数获取 值  输出
本质 只是在读 键盘的值  最后结果是 输出显示

二 消息队列的单工通信

半双工通信

一方为 接收 另一方为发送 通信为单项
复制两份代码  一个写接收函数 一个写发送函数

但是这里存在一个问题 你怎么确定 它发送去哪里 谁接收了呢

也就是要确定 一个id 地址 用 ftok函数确定

本质的含义

就是对某个结点 读写  (接收和的发送)

写的部分

//#include <sys/type.h>
#include <stdio.h>#include <unistd.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>struct mtype
{long mtybe;char atext[128];}sendbuff,readbuff;int main()
{key_t key;int res;int ipc_id;/* ftok :让消息队列产生交流的函数 返回值是最后的结果也就是 frok 的 结果是让他们建立通信的桥梁(key)*/key=ftok("duqu.c",1);ipc_id= msgget(key,IPC_CREAT|0755);if(ipc_id==-1) return -1;  printf("succed id is %d\n",ipc_id);    sendbuff.mtybe=100;while(1){memset(sendbuff.atext,0,128);   //清除遗留数据 fgets(sendbuff.atext,128,stdin);//重新输入 msgsnd(ms,(void *)&sendbuff,strlen(sendbuff.atext),0);//读取输入 }return 0;
}
IPC_CREAT :没有就创建
frok 函数返回值就是 key 值 并且和 msgget 配合使用 所以msgget 的 一个参数改为 ftok的返回值

还有一种情况 用了 IPC_CREAT 但是出现这个错误


解决

直接 touch xx.c 就行了

获取函数 部分


#include <unistd.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <stdio.h>struct mtype
{long mtybe;char atext[128];}sendbuff,readbuff;int main()
{key_t key;int res;int rs;int ms;key=ftok("duqu.c",1);ms=msgget(key,IPC_CREAT|0755);if(ms==-1)return -2;printf("ms: %d\n",ms);sendbuff.mtybe=100;while(1){memset(readbuff.atext,0,128);//清除遗留数据 rs=msgrcv(ms,(void *)&readbuff,128,100,0); printf("read is %s\n",readbuff.atext);printf("len is %d\n",rs);}return 0;
}}```csharp
开 两个终端  一个 下载  读 函数  一个 下载 写函数

成功

三 消息队列的半双工通信

在上一节的读写函数 上加 fork 函数  和 父子进程判断 而已

注意 全双工可以这样

圈圈表示一个家庭 里面是成员

半双工

两方在某个时刻可接收发送

比如 用父子进程作为通信的对象

父进程 发送 (另外一边的父进程接收)

#include <sys/type.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>strcut mtype
{long mtybe;char atext[128];}sendbuff,readbuff;int main()
{int key;int rs;pid_t pid;key=ftok("duqu.c",1); if(key==-1){perror("why;");return -2;}int ipc_id=msgget(key,IPC_CREAT|0777);sendbuff.mtybe=100;pid=fork();//产生子进程if(pid>0){while(2){       memset(sendbuff.atext,0,128);fgets(sendbuff.atext,128,stdin);//输入 msgsnd(ipc_id,(void *)&sendbuff,strlen(sendbuff.atext),0);//读取输入 }}if(pid==0){while(2){memset(readbuff.atext,0,128);  rs=msgrcv(ipc_id,(void *)&readbuff,128,200,,0);//获取printf("read is %s\n",readbuff.atext);printf("len is %d\n",rs);}}return 0;
}

子进程 发送 (另外一边的子进程接收)

#include <sys/type.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>strcut mtype
{long mtybe;char atext[128];}sendbuff,readbuff;int main()
{int key;int rs;pid_t pid;key=ftok("a.c",1);if(key==-1){perror("why;");return -2;}int ipc_id = msgget(key,IPC_CREAT|0777);sendbuff.mtybe=200;pid=fork();//产生子进程if(pid==0){while(2){memset(sendbuff.atext,0,128);  fgets(sendbuff.atext,128,stdin);//输入 msgsnd(ipc_id ,(void *)&sendbuff,strlen(sendbuff.atext),0);//读取输入 }}if(pid>0)//(另外一边的父进程接收){while(2){memset(readbuff.atext,0,128);  rs=msgrcv(ipc_id ,(void *)&readbuff,128,100,,0);//获取printf("read is %s\n",readbuff.atext);printf("len is %d\n",rs);}}return 0;
}


如果 在 复制过来的代码 改成了 半双工 通讯 ftok函数的c文件 是一样的 需要编译前 把 c文件 删除 再创建 因为消息队列 写一次 读一次 否则 在代码 运行时 会一直读到空的数据
输入多少 是不确定的 所以用 sizeof 确定 读取对方的数据是确定的 对方发送多少 就读多少

linux 消息队列的单工通信,半双工通信相关推荐

  1. linux.调整收发队列,linux消息队列通信

    程序目的:学习linux消息队列通信 所用主要函数:msgget(),msgsnd(),msgrcv(),msgctl() 首先介绍每个函数的用法: (1)msgget 使用格式: #include ...

  2. 单工通信/半双工通信/全双工通信,串行传输/并行传输,同步传输/异步传输的区别

    学习通信的时候,这几个名词单工通信/半双工通信/全双工通信,串行传输/并行传输,同步传输/异步传输我一直都很迷,现在我总结一下,也是加深我的记忆了 1.按照信息在信道中的传输方向分为: a.单工通信: ...

  3. 计算机实际应用的例子,作业二:单工通信;半双工通信; 双工通信;有哪些实际应用的例子...

    单工通信: 所谓单工通信,是指消息只能单方向传输的工作方式.例如遥控.遥测,就是单工通信方式 单工通信信道是单向信道,发送端和接收端的身份是固定的,发送端只能发送信息,不能接收信息:接收端只能接收信息 ...

  4. linux消息队列非亲缘,linux进程

    linux进程Tag内容描述: 1.linux消息队列进程通信 一.消息队列的基本概念消息队列(也叫做报文队列)是Unix系统V版本中3种进程间通信机制之一.另外两种是信号灯和共享内存.这些IPC机制 ...

  5. linux 消息队列 msgget/msgsnd/msgrecv

    专栏内容:linux下并发编程 个人主页:我的主页 座右铭:天行健,君子以自强不息:地势坤,君子以厚德载物. 目录 前言 概述 原理 消息队列的大小 查看资源 接口 代码演示 结尾 前言 本专栏主要分 ...

  6. 基于Linux用C语言实现TCP半双工通信和UDP半双工通信

    文章目录 TCP协议/UDP协议介绍 三种通信方式 实现TCP半双工通信 所用到的结构体与函数 源代码 运行结果 实现UDP半双工通信 源代码 运行结果 参考文章 TCP协议/UDP协议介绍 TCP/ ...

  7. 安卓+php推,使用 PHP 消息队列实现 Android 与 Web 通信

    需求描述很简单:Android 发送数据到 Web 网页上. 系统: Ubuntu 14.04 + apache2 + php5 + Android 4.4 思路是 socket + 消息队列 + 服 ...

  8. PHP下操作Linux消息队列完成进程间通信的方法

    2019独角兽企业重金招聘Python工程师标准>>> 来源:http://www.jb51.net/article/24353.htm 关于Linux系统进程通信的概念及实现可查看 ...

  9. [Linux]消息队列

    我们知道进程间通信的方法有多种,主要有管道,消息队列,信号量,共享内存,socket等.之前介绍过管道,今天再介绍一个新的概念–消息队列. 消息队列:将一个进程到另一个进程之间发送数据块的方式.这些发 ...

最新文章

  1. 抗侧力构件弹性位移如何计算_穿心棒法盖梁施工计算书(工字钢)
  2. 红帽linux登陆错误,xmanager连接RedHat出错:/usr/X11R6/bin/xterm: No such file or directory
  3. java 同步方式 lock_Java的同步锁(Lock)
  4. python数组随机分组_Python实用黑科技——以某个字段进行分组
  5. java udp分别用DatagramSocket和DatagramChannel实现多计算机接收广播数据
  6. 编程语言是从哪蹦出来的——大型伦理寻根现场
  7. python多线程为什么要用队列_Python程序中的线程操作-线程队列
  8. 10月15日 第一天申请成功
  9. thinkphp下载远程图片到本地
  10. centos虚拟机复制后网络重启出错解决
  11. Visual Studio2012 安装教程
  12. php嵌入wowza,Wowza服务器上的PHP脚本无法通过HTTP身份验证?
  13. 小米note3如何打开usb调试
  14. B.FRIENDit壁虎忍者品牌故事
  15. 2022年R2移动式压力容器充装特种作业证考试题库及在线模拟考试
  16. aardio - MsSql数据库+虚表示例
  17. Steve Jobs 2005年于 Stanford University 毕业典礼上的演讲
  18. dxp全称_DXP中常用的元器件中英文名称对照
  19. leetcode 273. 整数转换英文表示[困难]
  20. python多线程数据交互_python 多线程 通信

热门文章

  1. LTE学习笔记--PHY--TM模式
  2. 面试题和问题总结-面试题2
  3. 数据库视图的基本操作(sql语句)
  4. 初来乍到,springboot入门项目
  5. oracle并行查询结果不唯一,Oracle并行查询出错
  6. Revit完整案例教程
  7. 解决腾讯文档使用收集表收集图片,图片无法批量保存到本地问题
  8. 计算机二级各个科目的区别,计算机二级考试的各个科目的内容及区别
  9. iphone开发中的手势操作:Multiple Taps
  10. references column 'xxx' which is not in SELECT list