LINUX下嵌入式C消息队列函数API

相关函数的说明:

函数名

msgget

头文件

#include <sys/ipc.h>
#include <sys/msg.h>

函数原型

int msgget(key_t key, int msgflg);

函数功能

获取一个消息队列。

参数说明

1.key:消息队列对象的关键字(key),函数将它与已有的消息队列对象的关键字进行比较来判断消息队列对象是否已经创建。而函数进行的具体操作是由msgflg来确定。
2.msgflg:消息队列的建立标志和存取权限。它可以取下面的几个值:
IPC_CREAT :
  如果消息队列对象不存在,则创建之,否则进行打开操作;
IPC_EXCL:
  和IPC_CREAT 一起使用(用”|”连接),如果消息对象不存在则创建之,否则产生一个错误并返回。
  如果单独使用IPC_CREAT 标志,msgget()函数要么返回一个已经存在的消息队列对象的标识符,要么返回一个新建立的消息队列对象的标识符。如果将IPC_CREAT和IPC_EXCL标志一起使用,msgget()将返回一个新建的消息对象的标识符,或者返回-1,如果消息队列对象已存在。IPC_EXCL 标志本身并没有太大的意义,但和IPC_CREAT 标志一起使用可以用来保证所得的消息队列对象是新创建的而不是打开的已有的对象。
  除了以上的两个标志以外,在msgflg 标志中还可以有存取权限控制符。这种控制符的意义和文件系统中的权限控制符是类似的。如:IPC_CREAT|0666。

函数返回值

成功:返回消息队列标识值;失败:-1,并设置errno。

函数名

msgsnd

头文件

#include <sys/ipc.h>
#include <sys/msg.h>

函数原型

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

函数功能

将一个新的消息写入队列,为了发送消息,调用进程对消息队列进行写入时必须有写权限。

参数说明

1.msqid:消息队列的描述符。(由msgget()函数得到)。
2.msgp:指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用户可定义的通用结构,形态如下
struct msgbuf {
    long mtype;   /* 消息类型,必须 > 0 */
    char mtext[1];  /* 消息文本 */
};
3.msgsz:要发送信息的长度(字节数),可以用以下的公式计算:
msgsz = sizeof(struct msgbuf) - sizeof(long);
4.msgflg:这个参数依然是是控制函数行为的标志,取值可以是:0,表示忽略;
IPC_NOWAIT,如果消息队列已满,消息将不被写入队列,控制权返回调用函数的线程。如果不指定这个参数,线程将被阻塞直到消息被可以被写入。

函数返回值

成功:返回0;失败:返回-1,并且设置errno。

函数名

msgrcv

头文件

#include <sys/ipc.h>
#include <sys/msg.h>

函数原型

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtype, int msgflg);

函数功能

从消息队列中读取消息,接收消息时必须有读权限。

参数说明

1.msqid:消息队列的标识符。(由msgget()函数得到)。
2.msgp:指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用户可定义的通用结构,形态如下
struct msgbuf {
    long mtype;   /* 消息类型,必须 > 0 */
    char mtext[1];  /* 消息文本 */
};
3.msgsz:要发送信息的长度(字节数),可以用以下的公式计算:
msgsz = sizeof(struct msgbuf) - sizeof(long);
4.msgtype:消息类型
msgtype等于0,则返回队列的最早的一个消息。
msgtype大于0,则返回其类型为msgtype的第一个消息。
msgtype小于0,则返回其类型小于或等于msgtype参数的绝对值的最小的一个消息。
5.msgflg:这个参数依然是是控制函数行为的标志,取值可以是:0,表示忽略;IPC_NOWAIT,如果消息队列为空,则返回一个ENOMSG,并将控制权交回调用函数的进程。如果不指定这个参数,那么进程将被阻塞直到函数可以从队列中得到符合条件的消息为止。如果一个client 正在等待消息的时候队列被删除,EIDRM 就会被返回。如果进程在阻塞等待过程中收到了系统的中断信号,EINTR 就会被返回。MSG_NOERROR,如果函数取得的消息长度大于msgsz,将只返回msgsz 长度的信息,剩下的部分被丢弃了。如果不指定这个参数,ETOBIG 将被返回,而消息则留在队列中不被取出。当消息从队列内取出后,相应的消息就从队列中删除。

函数返回值

成功:拷贝到mtext数组的实际字节数;失败:返回-1,并且设置errno。

函数名

msgctl

头文件

#include <sys/ipc.h>
#include <sys/msg.h>

函数原型

int msgctl ( int msgqid, int cmd, struct msqid_ds *buf );

函数功能

消息队列属性控制。

参数说明

1.msgqid:消息队列对象的标识符。
2.cmd:要对消息队列进行的操作,它可以是:
IPC_STAT:取出系统保存的消息队列的msqid_ds 数据,并将其存入参数buf 指向的msqid_ds 结构中。
IPC_SET:设定消息队列的msqid_ds 数据中的msg_perm 成员。设定的值由buf 指向的msqid_ds结构给出。
IPC_RMID:从系统内核中移走消息队列。
需要强调的是在IPC_STAT命令中队列的msqid_ds 数据中唯一能被设定的只有msg_perm 成员,其是ipc_perm 类型的数据。而ipc_perm 中能被修改的只有mode,pid 和uid 成员。其他的都是只能由系统来设定的。

函数返回值

成功:返回0;失败:返回-1,并且设置errno。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值