关于linux系统消息队列的问题

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);

每个消息都类似如下的数据结构:

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"。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值