本人初学ARM板开发,今天学习linux下的消息队列函数
例子程序下载:
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) //删除消息队列
例子程序下载: