linux消息队列函数

来源:互联网 发布:mes 生产优化调度算法 编辑:程序博客网 时间:2024/05/16 08:40

本人初学ARM板开发,今天学习linux下的消息队列函数

 

例子程序下载:

消息发送:msgsnd.c

消息接受:msgrcv.c 

1.key_t ftok(char *pathname,char proj)

返回文件名对应的键值(把消息队列当作文件处理)

头文件:#include <sys/types.h>    #include <sys/ipc.h>

pathname:文件名

proj:项目名(不为0即可)

 

2.int msgget(key_t key,int msgflg)

打开或创建消息队列

头文件:#include <sys/types.h>    #include <sys/ipc.h>    #include <sys/msg.h>

key:键值,由ftok获得

msgflg:标志位(

IPC_CREAT,如果不存在,创建新的消息队列

IPC_EXCL,与IPC_CREAT一起使用,表示如果消息队列已存在,则返回错误

IPC_NOWAIT,读写消息队列要求无法得到满足时,不阻塞)

返回值:与键值key相对应的消息队列描述字,出错时返回-1

**在以下两种情况下,将创建一个新的消息队列:

a)如果没有与键值key相对应的消息队列,并且msgflg参数中包含了IPC_CREAT标志位

b)key参数为IPC_PRIVATE

 

3.int msgsnd(int msqid,struct msgbuf *msgp,int msgsz,int msgflg)

向消息队列中发送一条消息

头文件:#include <sys/types.h>    #include <sys/ipc.h>    #include <sys/msg.h>

msqid:消息队列id(消息队列的描述字)

msgp:存放消息的结构(格式为:

struct msgbuf

{

int mtype; /*消息类型 > 0*/

char mtex[1]; /*消息数据,字符数组*/

};

msgsz:消息数据长度

msgflg:发送标志,有意义的msgflg标志为IPC_NOWAIT,指明消息队列中没有足够空间容纳要发送的消息时,msgsnd是否等待,0表示等待

返回值:发生错误时返回-1

 

4.int msgrcv(int msqid,struct msgbuf *msgp,int msgsz,long msgtyp,int msgflg)

从消息队列msqid中读取一个msgtyp类型的消息,并把消息存储在msgp指向的msgbuf结构体中。(在成功读取后,队列中的这条消息将被删除)

 

5.int msgctl (int msqid, int cmd, struct msqid_ds *buf)

消息队列属性控制

msqid:消息队列的标识符。

cmd:执行的控制命令,即要执行的操作。(包括以下选项:

IPC_STAT:读取消息队列属性。取得此队列的msqid_ds 结构,并将其存放在buf指向的结构中。

IPC_SET :设置消息队列属性。

IPC_RMID:删除消息队列。

IPC_INFO:读取消息队列基本情况。此命令等同于 ipcs 命令。

这 4 条命令(IPC_STAT、IPC_SET、IPC_INFO 和 IPC_RMID)也可用于信号量和共享存储。)

buf:临时的 msqid_ds 结构体类型的变量。用于存储读取的消息队列属性或需要修改的消息队列属性。

举例:msgctl(qid, IPC_RMID, NULL) //删除消息队列

 

例子程序下载:

消息发送:msgsnd.c

消息接受:msgrcv.c