IPC——消息队列
来源:互联网 发布:黑科技网络验证 编辑:程序博客网 时间:2024/05/20 13:37
参考书籍《Unix环境高级编程(第三版)》
消息队列是消息的链表,存储在内核中,由消息队列标识符标识。其读写原则符合队列的先进先出原则。当然,这并不完全是这样的。我们可根据消息队列的每一条消息的标识符去读取指定的消息。发送消息数据的结构体可自定义为如下结构体:
struct mymesg
{
long mtype;//消息标识符
char mtext[512];//消息数据
};
该结构体是可以自定义的哦。注意区分消息标识符和消息队列标识符。常用函数如下(具体可查看man手册):
函数名:
ftok函数
函数原形:
key_t ftok(const char *pathname,intproj_id);
函数功能:
生成ipc通信所需的键值
所属头文件:
#include <sys/types.h>
#include<sys/ipc.h>
返回值:
成功:返回键值
失败:返回-1
参数说明:
const char *pathname:路径名
int proj_id:项目ID号
函数名:
msgget函数
函数原形:
intmsgget(key_t key, int msgflg);
函数功能:
打开一个现有消息队列或者创建一个新队列
所属头文件:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
返回值:
成功:返回消息队列的标识号
失败:-1
参数说明:
key:键值
msgflg:附加信息
函数名:
msgsnd函数
函数原形:
intmsgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
函数功能:
将数据(即消息)放到消息队列中,总是放在队列尾端
所属头文件:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
返回值:
成功:返回0
失败:返回-1
参数说明:
intmsqid:消息队列的ID
constvoid *msgp:指向msgbuf结构体(参见man手册)
size_tmsgsz:消息数据的大小
intmsgflg:附加信息
函数名:
msgrcv函数
函数原形:
ssize_tmsgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
函数功能:
从消息队列中取消息
所属头文件:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
返回值:
成功:返回消息数据部分的长度
失败:返回-1
参数说明:
intmsqid:消息队列的ID
void*msgp:指向msgbuf结构体(参见man手册)
size_tmsgsz:指定读取的消息长度
longmsgtyp:指定消息类型(即该消息结构的标识ID,为一长整数)
msgtyp==0 返回队列中的对队首数据
msgtyp>0 返回队列中指定消息类型的数据
msgtyp<0 返回队列中消息类型值小于等于msgtyp绝对值的消息数据
intmsgflg:附加参数
函数名:
msgctl函数
函数原形:
intmsgctl(int msqid, int cmd, struct msqid_ds *buf);
函数功能:
对消息队列执行多种操作
所属头文件:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
返回值:
成功:返回0
失败:返回-1
参数说明:
intmsqid:消息队列的ID
intcmd:对队列执行的命令
structmsqid_ds *buf:指向msgqid_ds结构体的指针
编程实例:
#include<stdio.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>#include<string.h>#include<errno.h>struct mymesg{ long mtype;char mtext[512];}; int main(int argc,char **argv){struct mymesg msg;char str[13]="enjoy linux!";struct mymesg rcv;msg.mtype=100;strcpy(msg.mtext,str);key_t key=ftok("/home/fzz",1);int msgid=msgget(key,IPC_CREAT);if(-1==msgid)printf("msgqueue creat failed!\n");int length=sizeof(struct mymesg);if(-1==msgsnd(msgid,&msg,length,IPC_NOWAIT))printf("msgsnd() write msg failed,errno=%d[%s]\n",errno,strerror(errno));ssize_t size=msgrcv(msgid,&rcv,length,0,0);if(-1==size)printf("msgrcv() read msg failed,errno=%d[%s]\n",errno,strerror(errno));printf("read message is %s\n",rcv.mtext);exit(0);}
参考文章:http://www.cnblogs.com/lpshou/archive/2013/06/20/3145651.html
- IPC——消息队列
- IPC——消息队列
- IPC——消息队列
- IPC——消息队列
- linux ipc—消息队列
- IPC之—消息队列
- IPC——消息队列2
- XSI IPC——System V消息队列
- IPC下的双向通信——消息队列
- linux—进程通信IPC--system v-消息队列
- Liunx进程间IPC通信—消息队列
- Linux — IPC进程通信之消息队列详解
- linux IPC-消息队列
- linux IPC-消息队列
- IPC-msg 消息队列
- Linux IPC- 消息队列
- IPC之消息队列
- IPC-消息队列
- Android中的Bluetooth详解
- C静态存储区栈堆的区别
- 文件操作
- C#开源资源大汇总
- 5-14 数据结构啊poi W.区间对
- IPC——消息队列
- 数据绑定
- C++ 虚函数语义学
- 提高ASP性能的办法
- 第一个OC程序模板
- ACCESS中使用存储过程
- .net下BerkeleyDB操作封装C#版(附单元测试)
- OC语法细节
- hdu1162Eddy's picture——最小生成树