0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

消息隊(duì)列應(yīng)用于線程間通信的簡(jiǎn)單例子

Linux大陸 ? 來(lái)源:Linux大陸 ? 2023-05-12 10:12 ? 次閱讀

大家好,我是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)行:

09a74950-efe5-11ed-90ce-dac502259ad0.png

以上就是本次的分享,如果文章有幫助,麻煩幫忙轉(zhuǎn)發(fā),謝謝!

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 通信
    +關(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)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    不同VI隊(duì)列通信問(wèn)題

    使用生產(chǎn)者消費(fèi)者循環(huán)做多VI的數(shù)據(jù)通信,VI1中處理的數(shù)據(jù)進(jìn)入VI2的隊(duì)列中,請(qǐng)問(wèn)VI2的隊(duì)列如何在VI1中引用?點(diǎn)隊(duì)列引用右鍵創(chuàng)建常量么
    發(fā)表于 12-25 14:32

    IOT-OS之RT-Thread--- 線程同步與線程通信

    rt_thread,下面要介紹線程的同步與通信線程同步對(duì)象rt_sem / rt_mutex / rt_event和
    發(fā)表于 07-02 06:15

    TWEN-ASR ONE 語(yǔ)音識(shí)別系列教程(4)---多線程與消息隊(duì)列使用

    的節(jié)奏不一樣,如下圖所示。從實(shí)驗(yàn)現(xiàn)象我們可以看出,兩個(gè)線程的程序都在運(yùn)行,并且互不干擾。 二、消息隊(duì)列的使用與測(cè)試2.1消息隊(duì)列使用說(shuō)明???? 消息隊(duì)列是一種常
    發(fā)表于 07-02 16:27

    請(qǐng)問(wèn)ESP32雙核如何使用隊(duì)列進(jìn)行任務(wù)通信?

    隊(duì)列是什么?ESP32雙核如何使用隊(duì)列進(jìn)行任務(wù)通信?
    發(fā)表于 01-14 07:24

    如何將郵箱、消息隊(duì)列與信號(hào)用于RT-Thread線程通信

    1、RT-Thread操作系統(tǒng)的線程通信RT-Thread 操作系統(tǒng)的郵箱用于線程
    發(fā)表于 04-15 15:36

    【rtthread學(xué)習(xí)筆記系列】第三篇:線程是怎樣進(jìn)行通信

    一、線程通信在裸機(jī)中使用全局變量進(jìn)行功能通信,rtthread提供了三個(gè)工具用于
    發(fā)表于 04-22 11:20

    RT-thread內(nèi)核之進(jìn)程通信設(shè)計(jì)實(shí)現(xiàn)

    、互斥鎖、事件、郵箱、消息隊(duì)列。其中前5個(gè)主要表現(xiàn)為線程同步,郵箱與消息隊(duì)列表現(xiàn)為線程
    發(fā)表于 09-01 15:13

    RTT多線程通信機(jī)制有哪幾種及推薦?

    針對(duì)采用RTT OS ,啟動(dòng)了4個(gè)線程,兩個(gè)串口讀寫(xiě)線程(數(shù)據(jù)>10byte以上) 一個(gè)觸摸按鍵線程 一個(gè)顯示線程,針對(duì)這幾個(gè)線程間數(shù)據(jù)傳輸
    發(fā)表于 04-07 15:52

    QNX消息傳遞及其在線程通信的應(yīng)用

    本文介紹了QNX 嵌入式實(shí)時(shí)多任務(wù)操作系統(tǒng)的消息傳遞和微內(nèi)核體系結(jié)構(gòu)的特點(diǎn),創(chuàng)建線程的方法,消息傳遞的基本原理,以及阻塞式消息傳遞在線程通信的實(shí)現(xiàn)方法,并給出了
    發(fā)表于 08-11 08:46 ?31次下載

    c線程通信

    對(duì)于學(xué)習(xí)嵌入式Linux開(kāi)發(fā)得朋友說(shuō),這篇文章幫助你更加了解線程通信
    發(fā)表于 08-09 15:12 ?3次下載

    Java多線程總結(jié)之Queue

    在Java多線程應(yīng)用中,隊(duì)列的使用率很高,多數(shù)生產(chǎn)消費(fèi)模型的首選數(shù)據(jù)結(jié)構(gòu)就是隊(duì)列。Java提供的線程安全的Queue可以分為 阻塞隊(duì)列和非阻
    發(fā)表于 11-28 16:14 ?3277次閱讀
    Java多<b class='flag-5'>線程</b>總結(jié)之Queue

    淺談鴻蒙內(nèi)核代碼調(diào)度隊(duì)列

    鴻蒙內(nèi)核代碼中有兩個(gè)源文件是關(guān)于隊(duì)列的,一個(gè)是用于調(diào)度的隊(duì)列,另一個(gè)是用于線程通訊的IPC
    的頭像 發(fā)表于 10-23 11:00 ?1990次閱讀

    FreeRTOS系列第17篇---FreeRTOS隊(duì)列

    隊(duì)列是主要的任務(wù)通訊方式??梢栽谌蝿?wù)與任務(wù)、中斷和任務(wù)傳送信息。大多數(shù)情況下,隊(duì)列用于具有
    發(fā)表于 01-26 17:45 ?4次下載
    FreeRTOS系列第17篇---FreeRTOS<b class='flag-5'>隊(duì)列</b>

    RT-Thread文檔_線程通信

    RT-Thread文檔_線程通信
    發(fā)表于 02-22 18:29 ?0次下載
    RT-Thread文檔_<b class='flag-5'>線程</b><b class='flag-5'>間</b><b class='flag-5'>通信</b>

    進(jìn)程通信的消息隊(duì)列介紹

    消息隊(duì)列是一種非常常見(jiàn)的進(jìn)程通信方式。
    的頭像 發(fā)表于 04-08 17:27 ?279次閱讀