1\创建或打开消息队列
函数原型:int msgget(key_t key, int msgflg)
参数
第一个参数为ftok方法创建的一个kety_t或者为一个整数值
第二个参数为逻辑控制,IPC_CREAT:创建新标识符;IPC_CREAT|IPC_EXCL:创建新标识之前查看是由有已存在的标识符.

返回值
返回一个整形的标识符,返回的标识符是具有系统唯一性,也就是操作系统的全局变量,即系统中任何知道该值的进程都可以访问该消

息队列

2\发送消息队列
函数原型:int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg)
参数
第一个参数为msgget所获得IPC标识符
第二个参数为要发送的消息,其结构为struct msgbuf
第三个参数为要发送消息的大小
第四个参数为控制msgsnd行为的控制符IPC_NOWAIT表示消息的发送为一个无阻塞的操作.

返回值
0成功,-1失败

3\接收消息队列
函数原型:int msgrcv(int msqid, void *msgp, size_t msgsz, int msgtyp, int msgflg)
参数
第一个参数msqid,要接收消息队列的标识符
第二个参数msgp,要接收消息的缓冲区
第三个参数msgsz,要接收消息的大小
第四个参数msgtyp,等于该值的消息队列中的第一个消息(>0)或者等于小于该值绝对值消息队列中的第一个消息
第五个参数msgflg,接收消息的控制符,0一直等待消息到来;IPC_WAIT无阻塞等待

返回值
成功时返回接收到的消息大小,-1失败

实验代码:

/* 消息队列发送msgqueue_send.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/msg.h> #define MYMSGQUEUE_NAME "/tmp/mkfifo.0001" /* 已存在的文件名 */
#define MAKER_KEY 0x1234 struct msgbuf
{
int msg_type; /* 消息类型 */
char msg_data[1024]; /* 消息内容 */
}; int main(int argc, char *argv[])
{
struct msgbuf mymsg;
key_t mymsgkey;
int mymsgid;
int result; mymsgkey = ftok(MYMSGQUEUE_NAME, MAKER_KEY); /* 生成key */
if(mymsgkey == -1)
{
printf("make key failed, app exit!error : %s.\n", strerror(errno));
exit(-1);
}
printf("make key succeed, key : %d.\n", mymsgkey); mymsg.msg_type = 66;
strncpy(mymsg.msg_data, "This message is from the [msgqueue_send.c].", sizeof(mymsg.msg_data)); mymsgid = msgget(mymsgkey, IPC_CREAT|0666); /* 创建消息队列标识符 */
if(mymsgid < 0)
{
printf("create msgid failed, app exit!\n");
exit(-1);
}
printf("create msgid succeed, msgid : %d\n", mymsgid); result = msgsnd(mymsgid, &mymsg, sizeof(mymsg.msg_data), IPC_NOWAIT);
if(result < 0)
{
printf("send message queue failed, app exit!\n");
exit(-1);
}
printf("send message queue succeed, app exit!\n"); return 0;
}
/* 读取消息队列msgqueue_read.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/msg.h> #define MSGQUEUE_NAME "/tmp/mkfifo.0001" /* 已存在的文件名 */
#define MAKER_KEY 0x1234 struct msgbuf
{
int msg_type; /* 消息类型 */
char msg_data[1024]; /* 消息内容 */
}; int main(int argc, char *argv[])
{
key_t mymsgkey = ftok(MSGQUEUE_NAME, MAKER_KEY); /* 生成key */
if(mymsgkey == -1)
{
printf("make key failed, app exit!error : %s.\n", strerror(errno));
exit(-1);
}
printf("make key succeed, key : %d.\n", mymsgkey); int mymsgid = msgget(mymsgkey, IPC_CREAT|0666); /* 创建消息队列标识符 */
if(mymsgid < 0)
{
printf("create msgid failed, app exit!\n");
exit(-1);
}
printf("create msgid succeed, msgid : %d\n", mymsgid); struct msgbuf mymsg;
memset(mymsg.msg_data, '\0', sizeof(mymsg.msg_data));
int result = msgrcv(mymsgid, &mymsg, sizeof(mymsg.msg_data), 66, IPC_NOWAIT);
if(result < 0)
{
printf("receive message queue failed, app exit!\n");
exit(-1);
}
printf("receive message queue succeed.\n message : %s\n", mymsg.msg_data); return 0;
}

实验结果

用命令ipcs查看消息队列,发现有一个key为0x34000082的消息正是我们之前创建的一个消息队列,十进制为872415298

system的消息队列实例的更多相关文章

  1. System V 消息队列 实例

    前言: 消息队列是消息的链接表,存放在内核中,并由消息队列标识符标识.我们将称消息队列为 “队列”,其标识符为“队列I D”.msgget创建一个新队列或打开一个存在的队列; msgsnd向队列末端添 ...

  2. 进程间通信 System V 消息队列

    1.msgget (key_t ket,int flag) ; //创建一个新的消息队列或者访问一个已存在的消息队列 2.msgsnd(int msid, const void *ptr ,size_ ...

  3. 第6章 System V消息队列

    6.1 概述 System V消息队列在内核中是list存放的,头结点中有2个指针msg_first 和msg_last.其中每个节点包含:下个节点地址的指针.类型.长度.数据等. 6.2 函数 6. ...

  4. Linux进程通信之System V消息队列

    System V消息队列是Open Group定义的XSI,不属于POSIX标准.System V IPC的历史相对很早,在上个世70年代后期有贝尔实验室的分支机构开发,80年代加入System V的 ...

  5. 利用System V消息队列实现回射客户/服务器

    一.介绍 在学习UNIX网络编程 卷1时,我们当时可以利用Socket套接字来实现回射客户/服务器程序,但是Socket编程是存在一些不足的,例如: 1. 服务器必须启动之时,客户端才能连上服务端,并 ...

  6. POSIX和SYSTEM的消息队列应该注意的问题

    首先看看POSIX的代码: 1.posix_mq_server.c #include <mqueue.h>#include <sys/stat.h>#include <s ...

  7. UNIX环境高级编程——system V消息队列

    unix早期通信机制中的信号能够传送的信息量有限,管道则只能传送无格式字节流,这远远是不够的.     消息队列(也叫报文队列)客服了这些缺点:     消息队列就是一个消息的链表.     可以把消 ...

  8. linux c编程:System V消息队列一

    消息队列可以认为是一个消息链表,System V 消息队列使用消息队列标识符标识.具有足 够特权的任何进程都可以往一个队列放置一个消息,具有足够特权的任何进程都可以从一个给定队列读出一个消息.在某个进 ...

  9. 第二十五章 system v消息队列(一)

    IPC对象的持续性 随进程持续 :一直存在直到打开的最后一个进程结束.(如pipe和FIFO) 随内核持续 :一直存在直到内核自举(内核自举就是把主引导记录加载到内存,并跳转执行这段内存)或显示删除( ...

随机推荐

  1. 五中常见的PHP设计模式

    策略模式 策略模式是对象的行为模式,用意是对一组算法的封装.动态的选择需要的算法并使用. 策略模式指的是程序中涉及决策控制的一种模式.策略模式功能非常强大,因为这个设计模式本身的核心思想就是面向对象编 ...

  2. Linux中常用压缩打包工具

    Linux中常用压缩打包工具 压缩打包是常用的功能,在linux中目前常用的压缩工具有gzip,bzip2以及后起之秀xz.本文将介绍如下的工具常见压缩.解压缩工具以及打包工具tar. gzip2 直 ...

  3. 关于react16.4——高阶组件(HOC)

    高阶组件是react中用于重用组件逻辑的高级技术.可以说是一种模式.具体来说呢,高阶组件是一个函数,它接收一个组件并返回一个新的组件. 就像这样, const EnhancedComponent = ...

  4. hbase的api操作

    创建maven工程,修改jdk pom文件里添加需要的jar包 dependencies> <dependency> <groupId>jdk.tools</gro ...

  5. JedisClusterMaxRedirectionsException: Too many Cluster redirections

    发生环境 当时的redis集群配置:redis-trib.rb 127.0.0.1 .... redis.conf的bind是默认# 解决方案 将redis.conf的bind为局域网真实ip red ...

  6. Python面向对象编程-类的封装,继承、多态

    面向对象是一种程序设计思想,对象作为程序基本单元,包含了数据和操作数据的函数. 面向对象的三大特点--数据封装.多态和继承. #类的创建,class关键字,类名大写,object表示从哪个类继承而来, ...

  7. zzw原创_expdp及impdp中的exclude及include参数的那点事

    zzw原创:转载请注明出处 在oracle的expdp 及imdpd命令中,exclude及include参数还是有一些要注意的地方,特别是涉及选择性条件时. 一.通用 1.exclude及inclu ...

  8. cogs448

    ☆   输入文件:1.in   输出文件:1.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] 在某次膜拜大会上,一些神牛被要求集体膜拜.这些神牛被奖励每人吃一些神牛果. ...

  9. Physical Limits of ASM

    Oracle version 7, only 1,022 datafiles per database could be used.  Oracle version 11g, support 65,5 ...

  10. Python面向对象之继承

    前言: 继承是面向对象的3大特性之一,对于继承一点要注意一下4点. 一.基本查找 如果子类继承了父类,子类的实例化对象,没有的方法和属性会去父类找 class Parent(object): #父类 ...