1. 程式人生 > 實用技巧 >POSIX之訊息佇列

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;
}