POSIX之訊息佇列
阿新 • • 發佈:2020-10-18
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("刪除訊號失敗"); } return0; }
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; }