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