POSIX之消息队列
my_semqueue_send.c:
#include<stdio.h> #include<errno.h> #include<mqueue.h> #include<fcntl.h> #include<stdlib.h> #include<string.h> #include<unistd.h> void p_error(const char* str) { perror(str); exit(1); } int main(int argc,char* argv[]) { mqd_t mq=mq_open("/my_queue",O_WRONLY|O_CREAT,0666,NULL); //创建一个消息队列,默认保存在/dev/myqueuue,(为了跨平台可移植性的需要,加/) if(mq==-1) { p_error("mq_open failed"); } printf("my_queue open success\n"); int i=0,ret; char buf[100]="我是消息队列,接下来我要发送消息了"; while(1) { ret=mq_send(mq,buf,strlen(buf),0); //第三个参数表示优先级,为0则为系统默认设置 if(ret==-1) { p_error("发送失败"); } printf("发送成功\n"); sleep(1); } ret=mq_close(mq); if(ret==-1) { p_error("关闭信号量失败"); } ret=mq_unlink("/my_queue"); if(ret==-1) { p_error("删除信号失败"); } return 0; }
my_semqueue_receive.c:
#include<stdio.h> #include<errno.h> #include<mqueue.h> #include<fcntl.h> #include<stdlib.h> #include<string.h> #include<unistd.h> void p_error(const char* str) { perror(str); exit(1); } int main(int argc,char* argv[]) { mqd_t mq=mq_open("/my_queue",O_RDONLY,0666,NULL); //注意这里的第二个参数要为科=可读 if(mq==-1) { p_error("mq_open failed"); } printf("my_queue open success\n"); int i=0,ret; char *buf; unsigned int prio; ret=mq_getattr(mq,&attr); //获取消息队列的属性 if(ret<0) { p_error("获取消息队列属性失败"); } printf("消息队列默认属性--------\n"); printf("阻塞方式(0:非阻塞.1:阻塞)%ld\n",attr.mq_flags); printf("消息队列最大接受的消息条数:%ld\n",attr.mq_maxmsg); printf("消息队列中每条消息最大字节数:%ld\n",attr.mq_msgsize); printf("----------------------\n"); //根据消息队列中的消息条数动态分配内存 buf=(char*)malloc(sizeof(attr.mq_msgsize)); if(NULL==buf) { p_error("申请失败"); } while(1) { ret=mq_receive(mq,buf,attr.mq_msgsize,&prio); //第三个参数的大小不能小于消息队列msgsize if(ret==-1) { p_error("接受失败"); } printf("接收到%d个字节,缓冲区的数据为:%s\n",ret,buf); sleep(1); } mq_close(mq); mq_unlink("/my_queue"); return 0; }