教你如何创建Unix消息队列
创始人
2024-06-28 20:10:41
0

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

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

  1. int msqueue_create( name, maxnum, length )   
  2. char name;   
  3. int maxnum,length;   
  4. {   
  5. int i;   
  6. for ( i=0; i   
  7. if ( msqueue[i]==NULL )break;   
  8. //如果Unix消息队列全部被分配,返回错   
  9. if ( i==MAXQUEUE ) return MQERROR;   
  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. return i;   
  24. }   

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

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

  1. int msqueue_send ( id, buff, length )   
  2. int id, length;   
  3. caddr_t buff;   
  4. {   
  5. int pos;   
  6. //消息队列id错,返回错   
  7. if ( id<0 || id >= MAXQUEU ) return MQERROR;   
  8. //消息长度与创建时的长度不符,返回错   
  9. if ( length != msqueue[id]->elementLength ) return MQERROR;   
  10. //消息队列满,不能发送   
  11. if ( msqueue[id]->curElementNum >= msqueue[id]->maxElements )   
  12. return MQERROR;   
  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. return length;   
  27. }  


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

  1. int msqueue_receive ( id, buff, length )   
  2. int id, length;   
  3. caddr_t buff;   
  4. {   
  5. caddr_t temp;   
  6. int pos;   
  7. if(id<0||id>=MAXQUEUE)return MQERROR;   
  8. if(length != msqueue[id]->elementLength)   
  9. return MQERROR;   
  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. return length;   
  34. }   

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

【编辑推荐】

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

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
30分钟搞定iOS自定义相机 最近公司的项目中用到了相机,由于不用系统的相机,UI给的相机切图,必须自定义才可以。就花时间简单研究...
Intel将Moblin社区控... 本周二,非营利机构Linux基金会宣布,他们将担负起Moblin社区的管理工作,而这之前,Mobli...