man mq_overview
ls /dev/mqueue
cat /dev/mqueue/PIC名字
mqueue.h
librt.so
(real time)POSIX 消息队列主要有八个操作
*消息队列操作非常相似文件读写操作。
mqd_t mq_open(const char *name, int oflag, mode_t mode, struct mq_attr *attr)
#include // perror()
#include // mq_open()
#define FILE_MODE (S_IWUSR|S_IRUSR|S_IRGRP|S_IROTH) //0644
int main(){
struct mq_attr attr;
attr.mq_maxmsg = 100;
attr.mq_msgsize = 100;
mqd_t mqd = mq_open("/tmp.test",O_CREAT,FILE_MODE,&attr);
if(-1 == mqd){
perror("mq_open error");
return 1;
}
}
注意编译时可能需要加上
-lrt
。
/
开头,名字中不能包含其他的/
。int mq_unlink(const char *name)
#include // mq_unlink()
int main(){
mq_unlink("/tmp.test");
}
mqd_t mq_open(const char *name, int oflag)
#include // perror()
#include // mq_open()
int main(){
mqd_t mqd = mq_open("/tmp.test",O_RDONLY);
if(-1 == mqd){
perror("mq_open error");
return 1;
}
return 0;
}
int mq_close(mqd_t mqdes)
#include // perror()
#include // mq_open() mq_close()
int main(){
mqd_t mqd = mq_open("/tmp.test",O_RDONLY);
if(-1 == mqd){
perror("mq_open error");
return 1;
}
// ...
mq_close(mqd);
}
mq_close()
和文件的close()
类似,关闭后,消息队列并不从系统中删除。一个进程结束,会自动调用关闭打开着的消息队列。int mq_send(mqd_t mqdes, const char *msg_ptr,size_t msg_len, unsigned msg_prio)
#include // perror()
#include // mq_open() mq_send() mq_close()
int main(int argc,char* argv[]){
mqd_t mqd = mq_open("/tmp.test",O_WRONLY); // 可以设置O_NONBLOCK
if(-1 == mqd){
perror("mq_open error");
return 1;
}
const char* msg = "HelloWorld";
if(-1 == mq_send(mqd,msg,sizeof(msg),1)){
perror("mq_send error");
mq_close(mqd);
return 1;
}
mq_close(mqd);
return 0;
}
mq_msgsize
会怎样?mq_maxmsg
会怎样?mq_send()
函数将阻塞,直到有可用空间再次允许放置消息。O_NONBLOCK
被指定,mq_send()
那么将不会阻塞,而是返回EAGAIN
错误。ssize_t mq_receive(mqd_t mqdes, char *msg_ptr,size_t msg_len, unsigned *msg_prio)
#include // perror()
#include // mq_open() mq_receive() mq_close()
#define FILE_MODE (S_IWUSR|S_IRUSR|S_IRGRP|S_IROTH) //0644
int main(int argc,char* argv[]){
mqd_t mqd = mq_open("/tmp.test",O_RDONLY);
if(-1 == mqd){
perror("mq_open error");
return 1;
}
char buf[BUFSIZ];
unsigned int prio;
if(-1 == mq_receive(mqd,buf,BUFSIZ,&prio)){
perror("mq_send error");
mq_close(mqd);
return 1;
}
printf("msg:%s\nprio:%d\n",buf,prio);
mq_close(mqd);
return 0;
}
mq_receive()
时总是返回队列中最高优先级的最早消息。mq_receive()
函数将阻塞,直到消息队列中有新的消息。O_NONBLOCK
被指定,mq_receive()
那么将不会阻塞,而是返回EAGAIN
错误。int mq_setattr(mqd_t mqdes, struct mq_attr *newattr,struct mq_attr *oldattr);
#include // perror()
#include // bzero()
#include // mq_open() mq_setattr() mq_close()
int main(){
mqd_t mqd = mq_open("/tmp.test",O_RDWR);
if(-1 == mqd){
perror("mq_open error");
return 1;
}
struct mq_attr new_attr;
bzero(&new_attr,sizeof(new_attr));
new_attr.mq_flags = O_NONBLOCK;
struct mq_attr attr;
if(-1 == mq_setattr(mqd,&new_attr,&attr)){
perror("mq_setattr error");
mq_close(mqd);
return 1;
}
printf("flag:%ld,Max msg:%ld,Max msgsize:%ld,Cur msgnun:%ld\n",attr.mq_flags,attr.mq_maxmsg,attr.mq_msgsize,attr.mq_curmsgs);
mq_close(mqd);
}
int mq_getattr(mqd_t mqdes, struct mq_attr *attr)
#include // perror()
#include // mq_open() mq_getattr() mq_close()
int main(){
mqd_t mqd = mq_open("/tmp.test",O_RDONLY);
if(-1 == mqd){
perror("mq_open error");
mq_close(mqd);
return 1;
}
struct mq_attr attr;
mq_getattr(mqd,&attr);
printf("flag:%ld,Max msg:%ld,Max msgsize:%ld,Cur msgnun:%ld\n",attr.mq_flags,attr.mq_maxmsg,attr.mq_msgsize,attr.mq_curmsgs);
mq_close(mqd);
return 0;
}
mq_setattr()
可以设置的属性只有mq_flags
,用来设置或清除消息队列的非阻塞标志。newattr
结构的其他属性被忽略。mq_maxmsg
和mq_msgsize
属性只能在创建消息队列时通过mq_open()
来设置。mq_open()
只会设置该两个属性,忽略另外两个属性。mq_curmsgs
属性只能被获取而不能被设置。