成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

教你如何創(chuàng)建Unix消息隊(duì)列

系統(tǒng) 其他OS
在這篇文章中,我們會(huì)教你如何創(chuàng)建Unix消息隊(duì)列的方法,應(yīng)用Unix消息隊(duì)列進(jìn)行消息的發(fā)送和接收發(fā)送消息到Unix消息隊(duì)列。

在我們以前學(xué)習(xí)過(guò)Unix 線程的知識(shí)后,我們來(lái)學(xué)習(xí)下Unix消息隊(duì)列的知識(shí),在文章中,我們主要講解Unix消息隊(duì)列的創(chuàng)建的知識(shí),希望對(duì)大家對(duì)Unix的學(xué)習(xí)有所幫助。

依據(jù)此數(shù)據(jù)結(jié)構(gòu)進(jìn)行Unix消息隊(duì)列的創(chuàng)建,函數(shù)為msqueue_create(參數(shù)解釋?zhuān)簄ame消息隊(duì)列名,maxnum消息的最大個(gè)數(shù),length單個(gè)消息的長(zhǎng)度)。
 

  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消息隊(duì)列全部被分配,返回錯(cuò)   
  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. //對(duì)保護(hù)鎖進(jìn)行初始化   
  17. pthread_mutex_init(&&msqueue[i]   
  18. ->mutex_buff, NULL);   
  19. pthread_mutex_init(&&msqueue[i]   
  20. ->mutex_cond, NULL);   
  21. //對(duì)線程同步條件變量初始化   
  22. pthread_cond_init(&&msqueue[i]->cond, NULL);   
  23. return i;   
  24. }   

應(yīng)用Unix消息隊(duì)列進(jìn)行消息的發(fā)送和接收發(fā)送消息到Unix消息隊(duì)列。

Unix消息隊(duì)列的發(fā)送和接收是在不同的線程中進(jìn)行的。首先介紹發(fā)送消息到Unix消息隊(duì)列的函數(shù):
 

  1. int msqueue_send ( id, buff, length )   
  2. int id, length;   
  3. caddr_t buff;   
  4. {   
  5. int pos;   
  6. //消息隊(duì)列id錯(cuò),返回錯(cuò)   
  7. if ( id<0 || id >= MAXQUEU ) return MQERROR;   
  8. //消息長(zhǎng)度與創(chuàng)建時(shí)的長(zhǎng)度不符,返回錯(cuò)   
  9. if ( length != msqueue[id]->elementLength ) return MQERROR;   
  10. //消息隊(duì)列滿,不能發(fā)送   
  11. if ( msqueue[id]->curElementNum >= msqueue[id]->maxElements )   
  12. return MQERROR;   
  13. //在對(duì)消息隊(duì)列緩沖區(qū)操作前,鎖住緩沖區(qū),以免其他線程操作   
  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. //如果插入消息前,消息隊(duì)列是空的,插入消息后,消息隊(duì)列為非空,則通知等待從消   
  20. 息隊(duì)列取消息的線程,條件滿足,可以取出消息進(jìn)行處理   
  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消息隊(duì)列中接收消息:
消息隊(duì)列的接收函數(shù) msqueue_receive,其參數(shù):id為消息隊(duì)列數(shù)組的索引號(hào),buff為
消息內(nèi)容,length為消息長(zhǎng)度。
 

  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. //如果消息隊(duì)列為空,則等待,直到消息隊(duì)列為非空條件滿足   
  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. //取消息前,鎖住消息隊(duì)列緩沖區(qū),以免其他線程存放或取消息   
  17. pthread_mutex_lock ( &&msqueue[id]->mutex_buff );   
  18. //為符合消息隊(duì)列FIFO特性,取出消息后,進(jìn)行消息隊(duì)列的調(diào)整   
  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. //解除緩沖區(qū)鎖   
  32. pthread_mutex_unlock ( &&msqueue[id]->mutex_buff );   
  33. return length;   
  34. }   

Unix消息隊(duì)列的創(chuàng)建工作,我們就學(xué)習(xí)到這里了,希望大家能夠?qū)W習(xí)如何創(chuàng)建Unix消息隊(duì)列。

【編輯推薦】

  1. 詳解Unix消息隊(duì)列知識(shí)
  2. 知識(shí)講堂Unix內(nèi)核教學(xué)
  3. HP Tru64 UNIX消息隊(duì)列處理本地拒絕服務(wù)漏洞
  4. Unix內(nèi)核與Linux內(nèi)核大比拼
  5. 知識(shí)講解Unix 消息隊(duì)列
責(zé)任編輯:小霞
相關(guān)推薦

2010-04-21 14:49:13

Unix消息隊(duì)列

2010-04-21 12:39:48

Unix 消息隊(duì)列

2010-04-13 17:00:43

Unix消息隊(duì)列

2010-04-21 12:12:56

Unix 消息隊(duì)列

2017-10-11 15:08:28

消息隊(duì)列常見(jiàn)

2024-03-22 12:10:39

Redis消息隊(duì)列數(shù)據(jù)庫(kù)

2024-05-10 09:36:36

架構(gòu)消息隊(duì)列

2023-11-27 13:42:00

消息隊(duì)列RocketMQ

2009-03-26 11:42:36

定時(shí)備份Oracle

2011-08-01 15:27:49

iPhone 界面

2024-08-02 10:55:30

2009-07-07 17:12:05

創(chuàng)建UNIX后門(mén)

2020-10-26 09:19:11

線程池消息

2014-11-06 09:36:50

OVSvlan

2009-07-07 17:10:04

創(chuàng)建UNIX后門(mén)

2009-12-22 13:56:24

如何創(chuàng)建IP標(biāo)準(zhǔn)訪問(wèn)表

2017-02-27 14:25:50

Java隊(duì)列Web

2009-12-07 09:23:05

2022-04-12 11:15:31

Redis消息隊(duì)列數(shù)據(jù)庫(kù)

2017-07-19 17:00:22

PHPPHP程序員消息隊(duì)列
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美在线日韩 | 伊人精品| 久久精品成人一区 | 波多野结衣av中文字幕 | 亚洲欧美综合网 | 日韩毛片免费视频 | 久久网一区二区三区 | 久草欧美视频 | 色资源在线观看 | 免费一级片 | 99re在线 | 91麻豆精品国产91久久久更新资源速度超快 | 精品国产免费一区二区三区演员表 | 精精国产xxxx视频在线野外 | 国产一区h | av一区二区三区 | 国偷自产av一区二区三区 | 日韩欧美中文 | 欧美性一区二区三区 | 国产精品久久久久久久久久久久 | 欧美在线观看一区 | 欧美专区在线视频 | 欧美a∨ | 亚洲精品资源 | 国产剧情一区二区三区 | 国产精品一区二区三区免费观看 | 超碰av人人 | 二区三区视频 | 亚洲精美视频 | 自拍视频网站 | 黄视频网址 | 午夜在线影院 | 成人在线精品视频 | 亚洲a在线观看 | 日韩高清av | 欧美一级大片 | 亚洲一区二区免费看 | 国产香蕉视频 | 国产精品久久精品 | 久久99精品久久久久久噜噜 | 成人污污视频 |