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) 随内核持续 :一直存在直到内核自举(内核自举就是把主引导记录加载到内存,并跳转执行这段内存)或显示删除( ...
随机推荐
- CentOS优化
一.CentOS6.x优化 #.更改yum源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup ...
- LeetCode--455--分发饼干
问题描述: 假设你是一位很棒的家长,想要给你的孩子们一些小饼干.但是,每个孩子最多只能给一块饼干.对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸:并且每块饼干 j , ...
- 第二阶段——个人工作总结DAY01
今天开始第二阶段的冲刺. 今天准备做什么:首先要先学习活动之间通过TextView用Intent实现跳转. 遇到的困难:无.
- python中for循环的底层实现机制 迭代
在python中,存在2种循环方式:for循环和while循环. while循环的实现很简单, 其本质就是一个条件语句,自定义条件,当条件满足的时候,不断执行while代码块. 但是for循环,究竟是 ...
- http.cof
## This is the main Apache HTTP server configuration file. It contains the# configuration directives ...
- python low版线程池
1.low版线程池设计思路:运用队列queue 将线程类名放入队列中,执行一个就拿一个出来import queueimport threading class ThreadPool(object): ...
- Slony-I同步复制部署
本次测试环境 IP 10.189.102.118 10.189.100.195 10.189.100.226 PGHOME /usr/local/pgsql /usr/local/pgsql /usr ...
- [CodeForces - 447A] A - DZY Loves Hash
A - DZY Loves Hash DZY has a hash table with p buckets, numbered from 0 to p - 1. He wants to insert ...
- 【转】EF 获取类的属性并排除特定属性(getType().GetProperties())
当获取一个类型(class)的所有属性时,想排除指定属性,该如何操作? 比如:EF中一个实体类型UserEntity,通过反射获取这个类的属性时,想排除这个为映射的字段ID 使用以下方法即可! Pro ...
- [LeetCode] 98. Validate Binary Search Tree(是否是二叉搜索树) ☆☆☆
描述 解析 二叉搜索树,其实就是节点n的左孩子所在的树,每个节点都小于节点n. 节点n的右孩子所在的树,每个节点都大于节点n. 定义子树的最大最小值 比如:左孩子要小于父节点:左孩子n的右孩子要大于n ...