消息队列通信

  消息队列就是一个消息(一个结构)的链表。而一条消息则可看作一个记录,具有特定的格式。进程可以从中按照一定的规则添加新消息;另一些进程则可以从消息队列中读走消息。

  每一个消息都是一个结构体:

struct msgbuf{

  long mtype;      //表示结构体类型,来区分不同的消息

  char mtext[1];     //消息数据

};

一、函数学习

1创建消息队列

1).函数名

  msgget

2).函数原型

  int msgget(key_t key,int msgflg)

3).函数功能

  打开或创建消息队列

4).所属头文件

  <sys/types.h><sys/ipc.h><sys/msg.h>

5).返回值

  成功:消息队列ID

  失败:-1

6).参数说明

  key:键值

  msgflg:打开标志,IPC_CREAT:表明新创建一个消息队列

2从消息队列中读出数据

1).函数名

  msgrcv

2).函数原型

  ssize_t msgrcv(int msgqid,void  *msgp,size_t msgsz,long msgtyp,int msgflg;)

3).函数功能

  从消息队列中接受消息

4).所属头文件

  <sys/types.h><sys/ipc.h><sys/msg.h>

5).返回值

  失败;-1

  成功:实际接收到消息长度

6).参数说明

  msgqid:消息队列id

  msgp:存放取出的消息

  msgsz:期望取到消息的最大长度

  msgtyp:消息的类型  0:忽略类型,直接取队列中的第一条消息

  >0:取消息队列中类型等于msgtyp的第一条消息

  <0:取类型比msgtyp的绝对值要小于或者等于的消息,如果有多条消息满足该条件,则取类型最小的一条

  msgflg:标志

3向消息队列写信息

1).函数名

  msgsnd

2).函数原型

  int msgsnd(int msqid,const void *msgp,size_t  msgsz,int msgflg);

3).函数功能

  向消息队列发送消息

4).所属头文件

  <sys/types.h><sys/ipc.h><sys/msg.h>

5).返回值

  失败:-1

  成功:0

6).参数说明

  msqid:消息队列的的id

  msgp:指向要发送的消息

  msgsz:消息的长度、消息中的这个成员char mtext[1]的长度

  msgflg:标志位

4删除消息队列(通过消息队列控制实现删除)

1).函数名

  msgctl

2).函数原型

  int msgctl(int msqid, int cmd, struct msqid_ds *buf)

3).函数功能

  控制消息队列

4).所属头文件

  <sys/types.h><sys/ipc.h><sys/msg.h>

5).返回值

  成功:0

  失败:-1

6).参数说明

  msqid:消息队列id

  cmd:对消息队列执行的操作命令,IPC_EMID用于删除消息

  buf:获取内核中的msqid_ds结构

二、实例学习

2.1首先编辑send.c文件

 #include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
struct msgt{
long msgtype;
char msgtext[];
}; int main()
{
int msqid;
int msg_type;
char str[];
struct msgt msgs;
//创建消息队列
msqid = msgget(,IPC_CREAT); //while
while()
{
printf("Please input message type,0 for quit!\n");
//获取消息类型
scanf("%d",&msg_type); //如果用户输入的消息类型为0,退出该循环
if(!msg_type)
break; //获取消息数据
printf("please input message content!\n");
scanf("%s",str); msgs.msgtype = msg_type;
strcpy(msgs.msgtext,str); //发送数据
msgsnd(msqid,&msgs,sizeof(struct msgt),);
} //删除消息队列
msgctl(msqid,IPC_RMID,);
return ;
}

2.2编辑read.c文件

 #include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h> int msqid = ; struct msgt{
long msgtype;
char msgtext[];
};
int childprocess()
{
struct msgt msgs;
while()
{
//接收消息队列
msgrcv(msqid,&msgs,sizeof(struct msgt),,); //打印消息队列中的数据
printf("msg text: %s\n",msgs.msgtext);
}
return ;
} int main()
{
int msqid;
int i;
int cpid;
//打开消息队列
msqid = msgget(,IPC_EXCL); //创建3个子进程
for(i=;i<;i++)
{
cpid = fork();
if(cpid<)
printf("creat child process error!\n");
else if(cpid ==)
childprocess();
}
//
return ;
}

2.3编译分别在两个linux终端运行两个进程

消息队列通信,王明学learn的更多相关文章

  1. 管道通信,王明学learn

    管道通信 一.通讯目的 1.数据传输 一个进程需要将数据发送给另一个进程. 2.资源共享 多个进程之间共享同样的资源. 3.通知事件 一个进程需要向另一个/组进程发送消息,通知它们发生了某事件. 4. ...

  2. linux消息队列通信

    IPC机制 进程间通信机制(Inter Process Communication,IPC),这些IPC机制的存在使UNIX在进程通信领域手段相当丰富,也使得程序员在开发一个由多个进程协作的任务组成的 ...

  3. 信号量互斥,王明学learn

    信号量互斥 信号量(又名:信号灯)与其他进程间通信方式不大相同,主要用途是保护临界资源(进程互斥).进程可以根据它判定是否能够访问某些共享资源.除了用于访问控制外,还可用于进程同步. 一.信号量分类 ...

  4. linux驱动程序设计的硬件基础,王明学learn

    linux驱动程序设计的硬件基础(一) 本章讲总结学习linux设备程序设计的硬件基础. 一.处理器 1.1通用处理器 通用处理器(GPP)并不针对特定的应用领域进行体系结构和指令集的优化,它们具有一 ...

  5. 共享内存同行,王明学learn

    共享内存同行 一.共享内存概念 共享内存是IPC机制中的一种,它允许两个不相关的进程访问同一段内存, 这是传递数据的一种非常有效的方式. 二.函数学习 这里主要有创建共享内存.映射共享内存.分离共享内 ...

  6. 进程控制理论,王明学learn

    进程控制理论 一.进程 进程是一个具有一定独立功能程序的一次运行活动. 1.1进程特点 1.动态性:进程的实质是程序的一次执行过程,进程是动态产生,动态消亡的 2.并发性:任何进程都可以同其他进程一起 ...

  7. linux内核的组成,王明学learn

    linux内核的组成 一.linux内核源代码目录结构 arch: 包含和硬件体系结构相关的代码, 每种平台占一个相应的目录, 如 i386.ARM.PowerPC.MIPS 等. block:块设备 ...

  8. linux设备驱动概述,王明学learn

    linux设备驱动学习-1 本章节主要学习有操作系统的设备驱动和无操作系统设备驱动的区别,以及对操作系统和设备驱动关系的认识. 一.设备驱动的作用 对设备驱动最通俗的解释就是“驱使硬件设备行动” .设 ...

  9. usb设备驱动描述,王明学learn

    usb设备驱动 本章主要内容包含以下:USB总线介绍,USB协议分析,USB系统架构 一.USB总线介绍 1.1USB发展史 USB(Universal Serial Bus)通用串行总线,是一种外部 ...

随机推荐

  1. 【Other】Ubuntu 14.04 pptp 客户端连接配置

    sudo apt-get install pptp-linux binutils modprobe ppp_mppe sudo pptpsetup --create testvpn --server ...

  2. Appium+Robotframework实现Android应用的自动化测试-3:一个必不可少的工具介绍

    万事具备,接下来我们就要开始编写测试脚本了. 不过,有个重要的问题还没有解决.我们知道RobotFramework在web 网页中主要依靠元素的id,name或者xpath来定位页面上的元素,我们依赖 ...

  3. spinlock原理

    [参考] http://www.searchtb.com/2011/06/spinlock%E5%89%96%E6%9E%90%E4%B8%8E%E6%94%B9%E8%BF%9B.html

  4. ios 使用block中使用self可能产生的循环引用

    在block中调用 self,那么就会引起循环引用问题,那么这是为什么呢? 为什么self会对block进行强引用呢???? 这里推荐一篇关于block的专业文章,http://blog.csdn.n ...

  5. QListWidget

    1.失去焦点背景颜色,代码设置全选的时候,背景会是白色,需要设置失去焦点背景颜色.(设置焦点,会出现白转化成设置背景色,效果不好) QPalette p; p.setColor(QPalette::I ...

  6. ffmpeg-20160813-bin.7z

    ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 S 下一帧 [ -2秒 ] +2秒 ; -1秒 ' +1秒 下一个帧 -> -5秒 f ...

  7. java 入门 第二季1

    (1). 类和对象(java 语言是面向对象的) 1). 类是对象的类型 具有相同的属性和方法的一组对象的集合 类:属性和方法 定义类: 类名 属性 方法 //class为关键字 2.定义类时,首字母 ...

  8. pgpool介绍和安装经验

    Pgpool的介绍 一.介绍 是一个工作在PostgreSQL多服务器和PostgreSQL数据库客户端之间的中间件. 二.概念图 三.功能 连接池:pgpool -Ⅱ保存 连 接到PostgreSQ ...

  9. malloc原理和内存碎片

    当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作: 1.检查要访问的虚拟地址是否合法 2.查找/分配一个物理页 3.填充物理页内容(读取磁盘,或者直接置0,或者啥也不干) 4.建立映射关系 ...

  10. C#中XmlTextWriter读写xml文件详细介绍(转)

    转自http://www.jb51.net/article/35230.htm   .NET中包含了很多支持XML的类,这些类使得程序员使用XML编程就如同理解XML文件一样简单.在这篇文章中,我将给 ...