欢迎访问生活随笔!

生活随笔

您现在的位置是:首页 > 形式科学 > 操作系统 > 其他OS

其他OS

教你如何创建Unix消息队列

发布时间:2022-09-30其他OS 系统管理员
在这篇文章中,我们会教你如何创建Unix消息队列的方法,应用Unix消息队列进行消息的发送和接收发送消息到Unix消息队列。

在我们以前学习过Unix 线程的知识后,我们来学习下Unix消息队列的知识,在文章中,我们主要讲解Unix消息队列的创建的知识,希望对大家对Unix的学习有所帮助。

依据此数据结构进行Unix消息队列的创建,函数为msqueue_create(参数解释:name消息队列名,maxnum消息的最大个数,length单个消息的长度)。

  1. intmsqueue_create(name,maxnum,length)
  2. charname;
  3. intmaxnum,length;
  4. {
  5. inti;
  6. for(i=0;i
  7. if(msqueue[i]==NULL)break;
  8. //如果Unix消息队列全部被分配,返回错
  9. if(i==MAXQUEUE)returnMQERROR;
  10. msqueue[i]=malloc(sizeof(mq_attribstruct));
  11. sprintf(msqueue[i]->name,"%s",name);
  12. msqueue[i]->maxElements=maxnum;
  13. msqueue[i]->elementLength=length;
  14. msqueue[i]->curElementNum=0;
  15. msqueue[i]->buff=malloc(maxnum?length);
  16. //对保护锁进行初始化
  17. pthread_mutex_init(&&msqueue[i]
  18. ->mutex_buff,NULL);
  19. pthread_mutex_init(&&msqueue[i]
  20. ->mutex_cond,NULL);
  21. //对线程同步条件变量初始化
  22. pthread_cond_init(&&msqueue[i]->cond,NULL);
  23. returni;
  24. }

应用Unix消息队列进行消息的发送和接收发送消息到Unix消息队列。

Unix消息队列的发送和接收是在不同的线程中进行的。首先介绍发送消息到Unix消息队列的函数:

  1. intmsqueue_send(id,buff,length)
  2. intid,length;
  3. caddr_tbuff;
  4. {
  5. intpos;
  6. //消息队列id错,返回错
  7. if(id<0||id>=MAXQUEU)returnMQERROR;
  8. //消息长度与创建时的长度不符,返回错
  9. if(length!=msqueue[id]->elementLength)returnMQERROR;
  10. //消息队列满,不能发送
  11. if(msqueue[id]->curElementNum>=msqueue[id]->maxElements)
  12. returnMQERROR;
  13. //在对消息队列缓冲区操作前,锁住缓冲区,以免其他线程操作
  14. pthread_mutex_lock(&&msqueue[id]->mutex_buff);
  15. pos=msqueue[id]->curElementNum*msqueue[id]->elementLength;
  16. bcopy(buff,&&msqueue[id]->buff[pos],msqueue[id]->elementLength);
  17. msqueue[id]->curElementNum++;
  18. pthread_mutex_unlock(&&msqueue[id]->mutex_buff);
  19. //如果插入消息前,消息队列是空的,插入消息后,消息队列为非空,则通知等待从消
  20. 息队列取消息的线程,条件满足,可以取出消息进行处理
  21. if(msqueue[id]->curElementNum==1){
  22. pthread_mutex_lock(&&msqueue[id]->mutex_cond);
  23. pthread_cond_broadcast(&&msqueue[id]->cond);
  24. pthread_mutex_unlock(&&msqueue[id]->mutex_cond);
  25. }
  26. returnlength;
  27. }


从Unix消息队列中接收消息:
消息队列的接收函数 msqueue_receive,其参数:id为消息队列数组的索引号,buff为
消息内容,length为消息长度。

  1. intmsqueue_receive(id,buff,length)
  2. intid,length;
  3. caddr_tbuff;
  4. {
  5. caddr_ttemp;
  6. intpos;
  7. if(id<0||id>=MAXQUEUE)returnMQERROR;
  8. if(length!=msqueue[id]->elementLength)
  9. returnMQERROR;
  10. //如果消息队列为空,则等待,直到消息队列为非空条件满足
  11. if(msqueue[id]->curElementNum==0){
  12. pthread_mutex_lock(&&msqueue[id]->mutex_cond);
  13. pthread_cond_wait(&&msqueue[id]->cond,&&msqueue[id]->mutex_cond);
  14. pthread_mutex_unlock(&&msqueue[id]->mutex_cond);
  15. }
  16. //取消息前,锁住消息队列缓冲区,以免其他线程存放或取消息
  17. pthread_mutex_lock(&&msqueue[id]->mutex_buff);
  18. //为符合消息队列FIFO特性,取出消息后,进行消息队列的调整
  19. temp=
  20. malloc((msqueue[id]->curElementNum-1)
  21. msqueue[id]-elementLength);
  22. bcopy(&&msqueue[id]->buff[0],buff,msqueue[id]->elementLength);
  23. msqueue[id]->curElementNum--;
  24. bcopy(&&msqueue[id]->buff[msqueue[id]->elementLength],temp,
  25. msqueue[id]->elementLength
  26. msqueue[id]->curElementNum);
  27. bcopy(temp,&&msqueue[id]->buff[0],
  28. msqueue[id]->elementLength
  29. msqueue[id]->curElementNum);
  30. free(temp);
  31. //解除缓冲区锁
  32. pthread_mutex_unlock(&&msqueue[id]->mutex_buff);
  33. returnlength;
  34. }

Unix消息队列的创建工作,我们就学习到这里了,希望大家能够学习如何创建Unix消息队列。

【编辑推荐】

  1. 详解Unix消息队列知识
  2. 知识讲堂Unix内核教学
  3. HP Tru64 UNIX消息队列处理本地拒绝服务漏洞
  4. Unix内核与Linux内核大比拼
  5. 知识讲解Unix 消息队列