关于linux系统消息队列的问题
2011-04-14 16:56
281 查看
linux下提供了以下几个接口,用于消息队列的使用:
头文件:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
函数原型:
key_t ftok( char * fname, int id )
int msgget(key_t key, int msgflg)
int msgrcv(int msqid, struct msgbuf *msgp, int msgsz, long msgtyp, int msgflg);
int msgsnd(int msqid, struct msgbuf *msgp, int msgsz, int msgflg);
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
每个消息都类似如下的数据结构:
一般使用步骤:
1. 用ftok产生一个key。
2. 调用msgget(使用key作为参数)产生一个队列
3. 进程可以用msgsnd发送消息到这个队列,相应的别的进程用msgrcv读取。
这里需要注意msgsnd可能会失败的两个情况:
a) 可能被中断打断(包括msgsnd和msgrcv). 尤其是大流量应用中更容易出现. 比较安全的用法是判断操作是否被中断打断,如果被打断, 则需要继续尝试。
b) 消息队列满。产生这个错误,则需要考虑提高系统消息队列规格,或者查看消息接收处是否有问题
4. msgctl函数可以用来删除消息队列
消息队列产生之后,除非明确的删除(可以用),产生的队列会一直保留在系统中。linux下消息队列的个数是有限的,注意不要泄露。如果 使用已经达到上限,msgget调用会失败,产生的错误码对应的提示信息为no space left on device.
注意点:
1.消息的类型 mtype 不需为非0值。如果使用0,则msgsnd会失败,并得到”Invalid argument“错误。
2.msgflg为0表示阻塞等待,如果msgflg为IPC_NOWAIT表示非阻塞。
3.最好使用root权限执行消息队列,否则msgrcv 提示 "Permission denied"。
头文件:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
函数原型:
key_t ftok( char * fname, int id )
int msgget(key_t key, int msgflg)
int msgrcv(int msqid, struct msgbuf *msgp, int msgsz, long msgtyp, int msgflg);
int msgsnd(int msqid, struct msgbuf *msgp, int msgsz, int msgflg);
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
每个消息都类似如下的数据结构:
struct msgbuf{ long mtype; char mtext[1]; }; |
1. 用ftok产生一个key。
2. 调用msgget(使用key作为参数)产生一个队列
3. 进程可以用msgsnd发送消息到这个队列,相应的别的进程用msgrcv读取。
这里需要注意msgsnd可能会失败的两个情况:
a) 可能被中断打断(包括msgsnd和msgrcv). 尤其是大流量应用中更容易出现. 比较安全的用法是判断操作是否被中断打断,如果被打断, 则需要继续尝试。
b) 消息队列满。产生这个错误,则需要考虑提高系统消息队列规格,或者查看消息接收处是否有问题
4. msgctl函数可以用来删除消息队列
消息队列产生之后,除非明确的删除(可以用),产生的队列会一直保留在系统中。linux下消息队列的个数是有限的,注意不要泄露。如果 使用已经达到上限,msgget调用会失败,产生的错误码对应的提示信息为no space left on device.
注意点:
1.消息的类型 mtype 不需为非0值。如果使用0,则msgsnd会失败,并得到”Invalid argument“错误。
2.msgflg为0表示阻塞等待,如果msgflg为IPC_NOWAIT表示非阻塞。
3.最好使用root权限执行消息队列,否则msgrcv 提示 "Permission denied"。
相关文章推荐
- 关于linux系统消息队列的问题
- 关于linux中消息队列的使用
- 关于Linux系统下在使用close关闭串口设备时引起的内核崩溃问题解决方法
- 关于zynq系统消息输出串口导致电路板无法启动的问题
- 关于linux多系统安装问题
- Linux 下开源消息队列系统 RabbitMQ 安装使用
- 关于Linux系统中configure中build,target,host中的若干问题
- 关于安装linux系统屏幕刷新率问题的详细介绍
- RHCE考试笔记3(关于linux系统下分区的问题)
- 关于,系统启动问题。linux,windows etc.
- 关于linux系统中无法识别某一命令问题的解决方案
- [linux系统编程]System V IPC 消息队列
- linux下安装配置rabbitmq(消息队列系统)
- 关于Windows消息队列的几个问题
- 关于实体机安装Linux系统时LOGO处卡死问题解决办法
- 关于Linux系统增加SCSI硬盘不识别的问题及解决办法
- LINUX系统中关于wunderbar_emporium.sh脚本系统漏洞的问题.
- 关于32位Linux系统内存溢出问题的情况及几种常见解决方法
- 关于POSIX消息队列mq_open提示错误信息:Invalid argument的问题
- 关于Linux系统安装oracle数据库的准备工作及安装过程中所遇问题