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) 随内核持续 :一直存在直到内核自举(内核自举就是把主引导记录加载到内存,并跳转执行这段内存)或显示删除( ...
随机推荐
- hdu-4632 Palindrome subsequence (回文子序列计数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4632 问题要求回答一串字符串中回文子序列的数量,例如acbca就有 a,c,b,c,a,cc,aa,a ...
- mysql 时间戳转换 、cnd、dns 通俗理解
- 151. Reverse Words in a String(java 注意细节处理)
题目:reverse words in a string Given an input string, reverse the string word by word. For example,Giv ...
- Remove Element leetcode java
问题描述: Given an array and a value, remove all instances of that value in place and return the new len ...
- 更改 Windows 软件默认安装位置教程
在打开的“运行”窗口中,输入命令regedit,然后点击确定按钮 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion 百度 ...
- bat语法需要注意的地方
if else 格式 if exist C:\Python27 ::空格 ( ::(与if在同一行 ...
- 4月18 数据库的CRUD操作
php主要是实现B/S Brower Server;此外还有C/S:Client Server暂时不考虑: LAMP: Linux系统 A阿帕奇服务器 Mysql数据库 Php语言,而现在学的是在wi ...
- 【JS】【4】字符串数字比较大小
两个转换函数: parseInt():把值转换成整数 parseFloat():把值转换成浮点数 也有其他方法,详情请看参考博客,但个人认为转换函数是最好的方法 参考文档: 1,js.jquery字符 ...
- GitHub 翻译之 'Hello-world' 翻译
https://guides.github.com/activities/hello-world/ 页面翻译 The Hello World project is a time-honored tra ...
- javaee登录界面
首先在此之前我们应该正确安装数据库,以及eclipse(javaee)文件包. 1.首先在javaee中建立新的项目 2.右键点击WebContent-New-JSP File,新建jsp(动态)文件 ...