进程间通信-POSIX 消息队列
#include <mqueue.h> mqd_t mq_open(const char *name, int oflag); mqd_t mq_open(const char *name, int oflag, mode_t mode, struct mq_attr *attr);
参数说明
返回值
注意事项
用法
1 #include<stdio.h> 2 #include<fcntl.h> 3 #include<mqueue.h> 4 #include<sys/stat.h> 5 6 int main(int argc, char** argv) 7 { 8 mqd_t mqd = mq_open("/myqueue", O_RDONLY | O_CREAT | O_EXCL, 0666, NULL); 9 if(mqd == -1) 10 { 11 perror("mq_open"); 12 return -1; 13 } 14 15 return 0; 16 }
gcc my_mqueue.c -o a.out -lrt
$ ./a.out $ ls -l /dev/mqueue/ 总用量 0 -rw-rw-r-- 1 test test 80 12月 21 10:04 myqueue
#include <mqueue.h>
int mq_close(mqd_t mqdes);
参数说明
返回值
#include <mqueue.h> int mq_unlink(const char *name);
参数说明
返回值
注意事项
struct mq_attr结构体
struct mq_attr { long mq_flags; long mq_maxmsg; long mq_msgsize; long mq_curmsgs; };
cat /proc/sys/fs/mqueue/msg_max #查看消息队列的消息最大长度
cat /proc/sys/fs/mqueue/msgsize_max #查看消息队列的消息最大个数
#include <mqueue.h> int mq_getattr(mqd_t mqdes, struct mq_attr *mqstat);
参数说明
返回值
#include <mqueue.h> int mq_setattr(mqd_t mqdes, const struct mq_attr *mqstat, struct mq_attr *omqstat);
参数说明
返回值
#include <mqueue.h> int mq_send(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned int msg_prio);
参数说明
返回值
#include <mqueue.h> ssize_t mq_receive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned int *msg_prio);
参数说明
返回值
1 #include<stdio.h> 2 #include<sys/stat.h> 3 #include<mqueue.h> 4 #include<fcntl.h> 5 #include<errno.h> 6 #include<unistd.h> 7 #include<stdlib.h> 8 9 int main(int argc, char** argv) 10 { 11 mqd_t mqd = mq_open("/my_mqueue", O_RDONLY); 12 if(mqd == -1) 13 { 14 perror("mq_open"); 15 return -1; 16 } 17 18 struct mq_attr attr; 19 if(mq_getattr(mqd, &attr) == -1) 20 { 21 perror("mq_getattr"); 22 return -1; 23 } 24 25 char* pBuf = (char*)malloc(attr.mq_msgsize); 26 if(pBuf == NULL) 27 { 28 perror("malloc"); 29 return -1; 30 } 31 32 int prio; 33 while(1) 34 { 35 int ret = mq_receive(mqd, pBuf,attr.mq_msgsize, &prio); 36 if(ret == -1) 37 { 38 if(errno == EAGAIN) 39 { 40 printf("no block, contimue to read\n"); 41 continue; 42 } 43 perror("mq_receive"); 44 return -1; 45 } 46 pBuf[ret] = '\0'; 47 printf("read data : %s, prio : %d\n", pBuf, prio); 48 sleep(1); 49 } 50 51 free(pBuf); 52 return 0; 53 }
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<unistd.h> 5 #include<sys/stat.h> 6 #include<errno.h> 7 #include<mqueue.h> 8 9 int main(int argc, char** argv) 10 { 11 struct mq_attr attr0; 12 //attr0.mq_flags = O_NONBLOCK; //在此处指定无效 13 attr0.mq_maxmsg = 5; 14 attr0.mq_msgsize = 4096; 15 mqd_t mqd; 16 17 AGAIN: 18 mqd = mq_open("/my_mqueue", O_WRONLY | O_CREAT | O_EXCL /*| O_NONBLOCK*/, 0666, &attr0); 19 if(mqd == -1) 20 { 21 if(errno == EEXIST) 22 { 23 mq_unlink("/my_mqueue"); 24 goto AGAIN; 25 } 26 perror("mq_open"); 27 return -1; 28 } 29 30 struct mq_attr attr; 31 if(mq_getattr(mqd, &attr) == -1) 32 { 33 perror("mq_getattr"); 34 return -1; 35 } 36 37 char* pBuf = (char*)malloc(attr.mq_msgsize); 38 if(pBuf == NULL) 39 { 40 perror("malloc"); 41 return -1; 42 } 43 44 /* 45 attr.mq_flags = 0; //取消非阻塞 46 if(mq_setattr(mqd, &attr, NULL) == -1) 47 { 48 perror("mq_setattr"); 49 return -1; 50 } 51 */ 52 int i = 0; 53 while(1) 54 { 55 sprintf(pBuf, "Data%d", i++); 56 int ret = mq_send(mqd, pBuf, strlen(pBuf) + 1, 10); 57 if(ret == -1) 58 { 59 if(errno == EAGAIN) 60 { 61 printf("no block, continue to write\n"); 62 continue; 63 } 64 perror("mq_send"); 65 return -1; 66 } 67 printf("send data : %s\n", pBuf); 68 sleep(1); 69 } 70 71 free(pBuf); 72 return 0; 73 }