大家好,我是LinuxZn。
在應(yīng)用開(kāi)發(fā)中,生產(chǎn)者,消費(fèi)者的模型非常常見(jiàn),一方產(chǎn)生數(shù)據(jù)并把數(shù)據(jù)放入隊(duì)列中,而另一方從隊(duì)列中取數(shù)據(jù),先進(jìn)先出。
應(yīng)用:線程間通信/進(jìn)程間通信。Hello系列 | 多線程編程基礎(chǔ)!
Linux系統(tǒng)中提供了兩種不同接口的消息隊(duì)列:
POSIX消息隊(duì)列。POSIX為可移植的操作系統(tǒng)接口。
System V消息隊(duì)列。System V 是 AT&T 的第一個(gè)商業(yè)UNIX版本(UNIX System III)的加強(qiáng)。
其中,POSIX消息隊(duì)列可移植性較強(qiáng),使用較廣。
Linux系統(tǒng)中提供的消息隊(duì)列一般應(yīng)用于進(jìn)行間通信,但也可以用于線程間通信。
本文介紹POSIX消息隊(duì)列應(yīng)用于線程間通信。
頭文件:
#include/*ForO_*constants*/ #include /*Formodeconstants*/ #include
編譯鏈接需要加上 -lr 鏈接。
Linux內(nèi)核提供了一系列函數(shù)來(lái)使用消息隊(duì)列:
/** *@brief創(chuàng)建消息隊(duì)列實(shí)例 * *Detailedfunctiondescription * *@param[in]name:消息隊(duì)列名稱 *@param[in] oflag:根據(jù)傳入標(biāo)識(shí)來(lái)創(chuàng)建或者打開(kāi)一個(gè)已創(chuàng)建的消息隊(duì)列 -O_CREAT:創(chuàng)建一個(gè)消息隊(duì)列 -O_EXCL:檢查消息隊(duì)列是否存在,一般與O_CREAT一起使用 -O_CREAT|O_EXCL:消息隊(duì)列不存在則創(chuàng)建,已存在返回NULL -O_NONBLOCK:非阻塞模式打開(kāi),消息隊(duì)列不存在返回NULL -O_RDONLY:只讀模式打開(kāi) -O_WRONLY:只寫(xiě)模式打開(kāi) -O_RDWR:讀寫(xiě)模式打開(kāi) *@param[in] mode:訪問(wèn)權(quán)限 *@param[in] attr:消息隊(duì)列屬性地址 * *@return成功返回消息隊(duì)列描述符,失敗返回-1,錯(cuò)誤碼存于error中 */ mqd_tmq_open(constchar*name,intoflag,mode_tmode,structmq_attr*attr); /** *@brief無(wú)限阻塞方式接收消息 * *Detailedfunctiondescription * *@param[in]mqdes:消息隊(duì)列描述符 *@param[in] msg_ptr:消息體緩沖區(qū)地址 *@param[in] msg_len:消息體長(zhǎng)度,長(zhǎng)度必須大于等于消息屬性設(shè)定的最大值 *@param[in] msg_prio:消息優(yōu)先級(jí) * *@return成功返回消息長(zhǎng)度,失敗返回-1,錯(cuò)誤碼存于error中 */ mqd_tmq_receive(mqd_tmqdes,char*msg_ptr,size_tmsg_len,unsigned*msg_prio); /** *@brief指定超時(shí)時(shí)間阻塞方式接收消息 * *Detailedfunctiondescription * *@param[in]mqdes:消息隊(duì)列描述符 *@param[in] msg_ptr:消息體緩沖區(qū)地址 *@param[in] msg_len:消息體長(zhǎng)度,長(zhǎng)度必須大于等于消息屬性設(shè)定的最大值 *@param[in] msg_prio:消息優(yōu)先級(jí) *@param[in] abs_timeout:超時(shí)時(shí)間 * *@return成功返回消息長(zhǎng)度,失敗返回-1,錯(cuò)誤碼存于error中 */ mqd_tmq_timedreceive(mqd_tmqdes,char*msg_ptr,size_tmsg_len,unsigned*msg_prio,conststructtimespec*abs_timeout); /** *@brief無(wú)限阻塞方式發(fā)送消息 * *Detailedfunctiondescription * *@param[in]mqdes:消息隊(duì)列描述符 *@param[in] msg_ptr:待發(fā)送消息體緩沖區(qū)地址 *@param[in] msg_len:消息體長(zhǎng)度 *@param[in] msg_prio:消息優(yōu)先級(jí) * *@return成功返回0,失敗返回-1 */ mqd_tmq_send(mqd_tmqdes,constchar*msg_ptr,size_tmsg_len,unsignedmsg_prio); /** *@brief指定超時(shí)時(shí)間阻塞方式發(fā)送消息 * *Detailedfunctiondescription * *@param[in]mqdes:消息隊(duì)列描述符 *@param[in] msg_ptr:待發(fā)送消息體緩沖區(qū)地址 *@param[in] msg_len:消息體長(zhǎng)度 *@param[in] msg_prio:消息優(yōu)先級(jí) *@param[in] abs_timeout:超時(shí)時(shí)間 * *@return成功返回0,失敗返回-1 */ mqd_tmq_timedsend(mqd_tmqdes,constchar*msg_ptr,size_tmsg_len,unsignedmsg_prio,conststructtimespec*abs_timeout); /** *@brief關(guān)閉消息隊(duì)列 * *Detailedfunctiondescription * *@param[in]mqdes:消息隊(duì)列描述符 * *@return成功返回0,失敗返回-1 */ mqd_tmq_close(mqd_tmqdes); /** *@brief分離消息隊(duì)列 * *Detailedfunctiondescription * *@param[in]name:消息隊(duì)列名稱 * *@return成功返回0,失敗返回-1 */ mqd_tmq_unlink(constchar*name);
例子:線程1不斷給線程2發(fā)送字符串?dāng)?shù)據(jù)。
#include#include #include #include #include #include /*ForO_*constants*/ #include /*Formodeconstants*/ #include #defineMQ_MSG_MAX_SIZE512///
編譯、運(yùn)行:
以上就是本次的分享,如果文章有幫助,麻煩幫忙轉(zhuǎn)發(fā),謝謝!
審核編輯:湯梓紅
-
通信
+關(guān)注
關(guān)注
18文章
5949瀏覽量
135783 -
Linux
+關(guān)注
關(guān)注
87文章
11207瀏覽量
208721 -
Linux系統(tǒng)
+關(guān)注
關(guān)注
4文章
590瀏覽量
27317 -
線程
+關(guān)注
關(guān)注
0文章
503瀏覽量
19636 -
消息隊(duì)列
+關(guān)注
關(guān)注
0文章
33瀏覽量
2964
原文標(biāo)題:消息隊(duì)列應(yīng)用于線程間通信 | 簡(jiǎn)單例子
文章出處:【微信號(hào):Linux大陸,微信公眾號(hào):Linux大陸】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論