消息队列创建以及使用示例
2015-08-02 19:37
323 查看
消息队列是消息的链接表,存放在内核中并由消息队列标示符标识。
1. 创建或打开一个队列
int msgget(key_t key, int flag);
key: 键 由ftok()生成
key_t ftok(const char* path, int id);
flag: IPC_CREAT 或 IPC_EXCL
2. 发送消息
int msgsnd(int msgid, const void* ptr, size_t nbyte, int flag);
msgid: 消息队列标识
ptr: 发送的消息,一般格式为:
struct _msg{
long mtype;
char _msg[512];
. . .
};
nbyte:消息大小,一般为sizeof(struct _msg)-sizeof(long)
flag: 0 默认阻塞方式
IPC_NOWAIT 非阻塞
3. 接收消息
int msgrcv(int msgid, void* ptr, size_t nbyte, long mtype, int flag);
msgQueue.h
#ifndef _MSGQUEUE_H_
#define _MSGQUEUE_H_
#include
#include
#include
#include
#include
using namespace std;
#define KEYPATH "/tmp/count"
#define KEYPROJ 'a'
#define NAMESIZE 16
#define MTYPE 2
typedef struct {
long mtype;
char name[NAMESIZE];
int iChiScore;
int iEngScore;
int iMathScore;
} S_SCORE_ST;
#endif
send.c
#include "msgQueue.h"
int main()
{
int iRet = 0;
key_t key;
int msgid;
S_SCORE_ST score_st;
do {
key = ftok(KEYPATH, KEYPROJ);
if (key < 0) {
iRet = -1;
cout << "ftok() error : " << key << endl;
break;
}
msgid = msgget(key, IPC_CREAT);
if (msgid < 0) {
iRet = -1;
cout << "msgget() error : " << msgid << endl;
break;
}
strcpy(score_st.name, "leex");
score_st.iChiScore = 100;
score_st.iEngScore = 100;
score_st.iMathScore = 100;
score_st.mtype = MTYPE;
iRet = msgsnd(msgid, &score_st, sizeof(score_st)-sizeof(long), 0);
if (iRet < 0) {
cout << "msgsnd() error : " << iRet << endl;
break;
}
} while(false);
return iRet;
}
recv.c
#include "msgQueue.h"
int main()
{
int iRet = 0;
key_t key;
int msgid;
S_SCORE_ST score_st;
do {
key = ftok(KEYPATH, KEYPROJ);
if (key < 0) {
iRet = -1;
cout << "ftok() error : " << key << endl;
break;
}
msgid = msgget(key, IPC_CREAT);
if (msgid < 0) {
iRet = -1;
cout << "msgget() error : " << msgid << endl;
break;
}
while (1) {
iRet = msgrcv(msgid, &score_st, sizeof(score_st)-sizeof(long), MTYPE, 0);
if (iRet < 0) {
cout << "msgrcv() error : " << iRet << endl;
break;
}
cout << "name:\t" << score_st.name << endl;
cout << "chinese score:\t" << score_st.iChiScore << endl;
cout << "english score:\t" << score_st.iEngScore << endl;
cout << "math score:\t" << score_st.iMathScore << endl;
}
} while(false);
return iRet;
}
1. 创建或打开一个队列
int msgget(key_t key, int flag);
key: 键 由ftok()生成
key_t ftok(const char* path, int id);
flag: IPC_CREAT 或 IPC_EXCL
2. 发送消息
int msgsnd(int msgid, const void* ptr, size_t nbyte, int flag);
msgid: 消息队列标识
ptr: 发送的消息,一般格式为:
struct _msg{
long mtype;
char _msg[512];
. . .
};
nbyte:消息大小,一般为sizeof(struct _msg)-sizeof(long)
flag: 0 默认阻塞方式
IPC_NOWAIT 非阻塞
3. 接收消息
int msgrcv(int msgid, void* ptr, size_t nbyte, long mtype, int flag);
msgQueue.h
#ifndef _MSGQUEUE_H_
#define _MSGQUEUE_H_
#include
#include
#include
#include
#include
using namespace std;
#define KEYPATH "/tmp/count"
#define KEYPROJ 'a'
#define NAMESIZE 16
#define MTYPE 2
typedef struct {
long mtype;
char name[NAMESIZE];
int iChiScore;
int iEngScore;
int iMathScore;
} S_SCORE_ST;
#endif
send.c
#include "msgQueue.h"
int main()
{
int iRet = 0;
key_t key;
int msgid;
S_SCORE_ST score_st;
do {
key = ftok(KEYPATH, KEYPROJ);
if (key < 0) {
iRet = -1;
cout << "ftok() error : " << key << endl;
break;
}
msgid = msgget(key, IPC_CREAT);
if (msgid < 0) {
iRet = -1;
cout << "msgget() error : " << msgid << endl;
break;
}
strcpy(score_st.name, "leex");
score_st.iChiScore = 100;
score_st.iEngScore = 100;
score_st.iMathScore = 100;
score_st.mtype = MTYPE;
iRet = msgsnd(msgid, &score_st, sizeof(score_st)-sizeof(long), 0);
if (iRet < 0) {
cout << "msgsnd() error : " << iRet << endl;
break;
}
} while(false);
return iRet;
}
recv.c
#include "msgQueue.h"
int main()
{
int iRet = 0;
key_t key;
int msgid;
S_SCORE_ST score_st;
do {
key = ftok(KEYPATH, KEYPROJ);
if (key < 0) {
iRet = -1;
cout << "ftok() error : " << key << endl;
break;
}
msgid = msgget(key, IPC_CREAT);
if (msgid < 0) {
iRet = -1;
cout << "msgget() error : " << msgid << endl;
break;
}
while (1) {
iRet = msgrcv(msgid, &score_st, sizeof(score_st)-sizeof(long), MTYPE, 0);
if (iRet < 0) {
cout << "msgrcv() error : " << iRet << endl;
break;
}
cout << "name:\t" << score_st.name << endl;
cout << "chinese score:\t" << score_st.iChiScore << endl;
cout << "english score:\t" << score_st.iEngScore << endl;
cout << "math score:\t" << score_st.iMathScore << endl;
}
} while(false);
return iRet;
}
相关文章推荐
- 71 独木舟上的旅行【贪心】
- 文章标题
- 【STL源码剖析】序列式容器
- 虚拟化技术一些概念整理
- alias用法
- Android 存储学习之使用SharedPreference保存文件
- printf输出颜色
- GitHub 的简单使用
- 求一个字符串中连续出现的次数最多的子串
- Android 常用 adb 命令总结
- Android SensorManager getOrientation getRotationMatrix
- C#高级编程六十二天----LINQ标准的查询操作符
- TortoiseSVN搭建本地版本库及简单操作使用
- MySQL配置SQL Assistant提示
- leetcode刷题。总结,记录,备忘162
- HDOJ1597 find the nth digit(二分)
- Remove Duplicates from Sorted Array
- suse下用zypper安装的vim插件路径
- Remove Element
- Linux系统FTP文件传输服务