system的消息队列实例
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的消息队列实例的更多相关文章
- System V 消息队列 实例
前言: 消息队列是消息的链接表,存放在内核中,并由消息队列标识符标识.我们将称消息队列为 “队列”,其标识符为“队列I D”.msgget创建一个新队列或打开一个存在的队列; msgsnd向队列末端添 ...
- 进程间通信 System V 消息队列
1.msgget (key_t ket,int flag) ; //创建一个新的消息队列或者访问一个已存在的消息队列 2.msgsnd(int msid, const void *ptr ,size_ ...
- 第6章 System V消息队列
6.1 概述 System V消息队列在内核中是list存放的,头结点中有2个指针msg_first 和msg_last.其中每个节点包含:下个节点地址的指针.类型.长度.数据等. 6.2 函数 6. ...
- Linux进程通信之System V消息队列
System V消息队列是Open Group定义的XSI,不属于POSIX标准.System V IPC的历史相对很早,在上个世70年代后期有贝尔实验室的分支机构开发,80年代加入System V的 ...
- 利用System V消息队列实现回射客户/服务器
一.介绍 在学习UNIX网络编程 卷1时,我们当时可以利用Socket套接字来实现回射客户/服务器程序,但是Socket编程是存在一些不足的,例如: 1. 服务器必须启动之时,客户端才能连上服务端,并 ...
- POSIX和SYSTEM的消息队列应该注意的问题
首先看看POSIX的代码: 1.posix_mq_server.c #include <mqueue.h>#include <sys/stat.h>#include <s ...
- UNIX环境高级编程——system V消息队列
unix早期通信机制中的信号能够传送的信息量有限,管道则只能传送无格式字节流,这远远是不够的. 消息队列(也叫报文队列)客服了这些缺点: 消息队列就是一个消息的链表. 可以把消 ...
- linux c编程:System V消息队列一
消息队列可以认为是一个消息链表,System V 消息队列使用消息队列标识符标识.具有足 够特权的任何进程都可以往一个队列放置一个消息,具有足够特权的任何进程都可以从一个给定队列读出一个消息.在某个进 ...
- 第二十五章 system v消息队列(一)
IPC对象的持续性 随进程持续 :一直存在直到打开的最后一个进程结束.(如pipe和FIFO) 随内核持续 :一直存在直到内核自举(内核自举就是把主引导记录加载到内存,并跳转执行这段内存)或显示删除( ...
随机推荐
- webpack+vue多入口环境搭建
项目地址:https://pan.baidu.com/s/1c1Dflp2 使用前提:安装nodejs环境,webpack的配置官网的例子跟着跑一遍,会vue开发 研究webpack+vue研究了一个 ...
- 倒排索引(Inverted Index)
倒排索引(Inverted Index) 倒排索引是一种索引结构,它存储了单词与单词自身在一个或多个文档中所在位置之间的映射.倒排索引通常利用关联数组实现.它拥有两种表现形式: inverted fi ...
- Confluence 6 空间中的常用宏
小组空间(Team Spaces): 介绍小组:User Profile Macro 将会对 Confluence 的用户显示属性的简单摘要,属性照片,联系方式. 在你小组中分享通知和新闻:The B ...
- 维护满足max(+ or -)min<=k的区间
这是一种经典的单调栈+线段树的维护方法. 从左到右枚举右端点. 线段树维护每一个左端点的max(+ or -)min的值. 每次右端点移动的时候,把a[i]加入单调栈. 每弹栈一次,便在线段树上把对应 ...
- SPL之Iterator和ArrayAccess的结合使用
<?php namespace TabControl; class MyIterator implements \Iterator, \ArrayAccess { private $data = ...
- Watto and Mechanism CodeForces - 514C (字典树,哈希)
大意: 给定字符串集$S$, 每次询问给出字符串$a$, 求$S$中是否存在一个字符串恰好与$a$相差一个字符. 直接建字典树暴力复杂度是$O(n\sqrt{n})$, 也可以用set维护所有哈希值, ...
- BigDecimal 类型数据比较大小
public static void main( String[] args ) { BigDecimal a=new BigDecimal(-1); if(a.compareTo(BigDecima ...
- JS保留小数 去尾法 进一法 四舍五入法
//toFixed 四舍五入遇到坑. 1.235.toFixed(2) = 1.23 1.2350001.toFixed(2) = 1.24 //去尾法 Number.prototype.toFloo ...
- Oracle11g温习-第十二章:tables
2013年4月27日 星期六 10:44 1.表的功能 存储.管理数据的基本单元(二维表:由行和列组成) 2.表的类型 1)普通表:[heap table(堆表) :数据存储时,无序的,对它的访问采 ...
- ASP.NET 后台页面无法识别服务器控件ID
在学习asp.net 的时候 发现有个页面服务器控件无法识别,提示未知元素 解决方法 将不能识别服务器控件ID 的后台文件 类名改写,重新生成一次. 然后再改回来就可以了.