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


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 5个月宝宝3天没拉大便怎么办 4个月宝宝3天没拉大便怎么办 20个月的宝宝大便干燥怎么办 20个月宝宝大便间隔三天怎么办 两个多月的宝宝四天没大便怎么办 两个多月的宝宝几天没大便怎么办 2个月3天没大便怎么办 两个月大的宝宝发烧40度怎么办 两个月大的宝宝感冒了怎么办 四个月宝宝拉水样大便要怎么办 六个月的宝宝咳嗽有痰怎么办 未满月的宝宝大便脓状怎么办 五个月的宝宝总是吃手怎么办 小孩子学数字怎么也学不会怎么办 小孩学数字老是学不会该怎么办 只买了大人票忘买儿童的了怎么办 铝合金滑动门没轨道安纱门怎么办 移门衣柜门与柜体有冶缝隙怎么办 推拉门关门时撞门框声音大怎么办 两岁宝宝夏天不盖被子怎么办 家里有好多会爬的小黑虫怎么办 刚贴的壁纸怎么发霉了怎么办 晚上睡觉一熄灯有许多小虫子怎么办 一岁宝宝夏天爱哭不爱吃饭怎么办 合肥房子卖了户口没地方迁怎么办 忌作灶的日子新房装橱柜了怎么办 刮水泥浆的墙面刮不住腻子怎么办 小学二年级孩子偷钱 老师怎么办 发现自己读初中的儿子偷钱怎么办? 做错事了得不到亲人的原谅怎么办? 窗口 窗套与墙缝隙大怎么办 中班小孩还不会认1到10怎么办 母猫奶头被小猫咬伤了怎么办 口红不小心弄到衣服上怎么办 脖子后背疼的睡不着觉应该怎么办 君子兰用高锰酸钾泡浓度高了怎么办 五个月宝宝认人不要奶奶睡怎么办 幼儿小班安全卡鱼刺了怎么办教案 学籍在一年级学生在二年级怎么办 一岁多宝宝挑食不爱吃饭菜怎么办饭 换了新手机微信好友显示不全怎么办