#include<sys/msg.h>
消息队列就是由内核负责管理的一个管道,可以按顺序发送消息包(消息包由消息类型、消息长度、消息内容组成),可以全双工工作。可以不按消息的顺序接收消息。
int msgget(key_t key,int msgflg);
功能:创建/获取消息队列
key:IPC键值,由ftok函数自动生成
msg_flag:
0 获取消息队列
IPC_CREAT 创建消息队列
IPC_EXCL 如果存在则创建失败
返回值:消息队列标识
int msgsnd(int msqid,const void *msgp,size_t msgsz,int msgflg);
功能:向消息队列发送信息
msqid:消息队列标识,msgget函数的返回值
msqp:结构指针
struct msgbuf{
long mtype; //消息类型
char mtext[n]; //消息内容
};
msgflg:
0 阻塞,当消息队列满时,等待
1 不阻塞,当消息队列满时,不等待
返回值:成功发送返回0,失败返回-1
msgsz:消息的长度,不包括消息类型,sizeof(msgbuf)-4 //4是消息类型
ssize_t msgrcv(int msqid,void *msgp,size_t msgsz,long msgtyp,int msgflg);
功能:从消息队列中按类型接收信息
msqid:消息队列标识,msgget函数的返回值
msqp:结构指针
struct msgbuf{
long mtype; //消息类型
char mtext[n]; //消息内容
};
msgsz:要接受一消息的长度
msgtyp:要接受的消息类型
0 接收任一类型的消息(接收队列中第一个消息)
>0 只接收msgtyp类型的消息
<0 接受消息队列中小于等于msgtyp绝对值的消息,取最小的那一个
msgflg:
0 阻塞,当消息队列中是否有对应类型的消息,没有则等待
1 不阻塞,当消息队列中没有对应类型的信息,则返回
------------------------------------
MSG_NOERROR:
消息类型正确,而当消息的实际长度大于msgsz,则不接收消息返回-1
如果msgflg带MSG_NOERROR,则把多余的消息截取,成功接收
IPC_NOWAIT:如果消息队列没有要接收的消息,则不等待,返回-1
MSG_EXCEPT:接收消息队列中第一个消息类型中不是msgtyp的消息 编译时添加 -D_GNU_SOURCE
返回值:成功接收到消息的字节数
int msgctl(int msqid,int cmd,struct msqid_ds *buf)
功能:删除消息队列,设置或获取消息队列属性
msqid:消息队列标识,msgget函数的返回值
cmd: IPC_STAT 获取消息队列的属性
IPC_SET 设置消息队列的属性
IPC_RMID 删除消息队列
返回值:成功返回0,失败返回-1
struct msqid_ds {
struct ipc_perm msg_perm; /* 权限 */
time_t msg_stime; /* 最后一条消息的发送时间 */
time_t msg_rtime; /* 最后一条消息接收时间*/
time_t msg_ctime; /* 最后一次修改时间 */
unsigned long __msg_cbytes; /* 消息队列中的字节数 */
msgqnum_t msg_qnum; /* 消息队列中消息的个数 */
msglen_t msg_qbytes; /* 消息队列中容纳的最大字节数*/
pid_t msg_lspid; /* 最后一次发送消息的进程*/
pid_t msg_lrpid; /* 最后一次接收消息的进程 */
};
struct ipc_perm{
key_t _key //IPC键盘
uid_t uid; //有效用户ID
gid_t gid; //有效组ID
uid_t cuid; //创建者的用户ID
gid_t cgid; //创建组的组ID
unsigned short mode; //权限
unsigned short _seq; //IPC标识
}