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

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

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

消息隊(duì)列實(shí)現(xiàn)進(jìn)程間通訊

嵌入式應(yīng)用開(kāi)發(fā) ? 來(lái)源:嵌入式應(yīng)用開(kāi)發(fā) ? 作者:嵌入式應(yīng)用開(kāi)發(fā) ? 2022-12-29 16:52 ? 次閱讀

創(chuàng)建消息隊(duì)列

消息隊(duì)列的創(chuàng)建,需要用到msgget函數(shù)。

int msgget(key_t key, int msgflg);

key:該參數(shù)是消息隊(duì)列的唯一標(biāo)識(shí),由ftok生成。
msgflg:取值有以下幾個(gè)選擇:IPC_CREAT、IPC_EXCL ,這兩個(gè)參數(shù)詳細(xì)的作用可以man msgflg看詳細(xì)介紹。

返回值:返回一個(gè)近乎唯一的Message queue id

我們可以指定一個(gè)文件,調(diào)用ftok ,它會(huì)根據(jù)這個(gè)文件的 inode,生成一個(gè)近乎唯一的 key。

key_t ftok(const char *pathname, int proj_id);


pathname:文件信息,必須指定在一個(gè)存在的,可訪問(wèn)的文件。
proj_id:8bit的數(shù)據(jù),0-255隨意設(shè)定。

這樣就可以獲得一個(gè)近乎唯一的key了!

只要在這個(gè)消息隊(duì)列的生命周期內(nèi),這個(gè)文件不要被刪除就可以了。只要不刪除,無(wú)論什么時(shí)刻,再調(diào)用 ftok,也會(huì)得到同樣的 key。

綜上,創(chuàng)建一個(gè)消息隊(duì)列只需兩步:

①:ftok生成一個(gè)key

②:msgget生成一個(gè)消息隊(duì)列的ID

如下:

int main() {
  int messagequeueid;
  key_t key;
 
 
  if((key = ftok("/root/messagequeue/messagequeuekey", 1)) < 0)
  {
      perror("ftok error");
      exit(1);
  }
 
 
  printf("Message Queue key: %d.n", key);
 
 
  if ((messagequeueid = msgget(key, IPC_CREAT|0777)) == -1)
  {
      perror("msgget error");
      exit(1);
  }
 
 
  printf("Message queue id: %d.n", messagequeueid);
}

ftok要指定一個(gè)存在的文件,所以我們?cè)趫?zhí)行之前,需要?jiǎng)?chuàng)建該文件。
查看消息隊(duì)列:

System V IPC 體系有一個(gè)統(tǒng)一的命令行工具:ipcmk,ipcs 和 ipcrm 用于創(chuàng)建、查看和刪除 IPC 對(duì)象。

查看創(chuàng)建的IPC對(duì)象:ipcs -q
dong@ubuntu:~//Interprocess_Communication$ ipcs
------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    
0x01110005 0          dong       777        0            0          
------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
------ Semaphore Arrays --------
key        semid      owner      perms      nsems

發(fā)送消息
消息隊(duì)列發(fā)送消息,主要調(diào)用msgsnd 函數(shù)。


int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
msqid:該參數(shù)是msgget所得到的message queue 的 id
msgp:消息結(jié)構(gòu)體
struct msg_buffer {
   long mtype;
   char mtext[1024];
};


msgsz:表示消息結(jié)構(gòu)體中,mtext最大長(zhǎng)度。
msgflg:一位掩碼,可取值有:IPC_NOWAIT、MSG_COPY、MSG_EXCEPT、MSG_NOERROR,取值說(shuō)明可見(jiàn)man msgsnd
接收消息
消息隊(duì)列接收消息,主要調(diào)用msgrcv 函數(shù)。
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
int msgflg);
msqid:該參數(shù)是msgget所得到的message queue 的 id
msgp:消息結(jié)構(gòu)體

msgsz:可接收數(shù)據(jù)最大長(zhǎng)度

msgflg:一位掩碼,可取值有:IPC_NOWAIT、MSG_COPY、MSG_EXCEPT、MSG_NOERROR,取值說(shuō)明可見(jiàn)man msgsnd
有了消息這種模型,兩個(gè)進(jìn)程之間的通信就像咱們平時(shí)發(fā)郵件一樣,你來(lái)一封,我回一封,可以頻繁溝通了。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(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)注

    5059

    文章

    18974

    瀏覽量

    302069
  • 隊(duì)列
    +關(guān)注

    關(guān)注

    1

    文章

    46

    瀏覽量

    10882
  • 進(jìn)程
    +關(guān)注

    關(guān)注

    0

    文章

    201

    瀏覽量

    13938
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux下進(jìn)程通訊消息隊(duì)列

    進(jìn)行通信。 消息隊(duì)列與 FIFO 很相似,都是一個(gè)隊(duì)列結(jié)構(gòu),都可以有多個(gè)進(jìn)程隊(duì)列里面寫信息,多個(gè)進(jìn)程
    的頭像 發(fā)表于 08-19 19:56 ?1775次閱讀
    Linux下<b class='flag-5'>進(jìn)程</b><b class='flag-5'>通訊</b>消息<b class='flag-5'>隊(duì)列</b>

    基于隊(duì)列函數(shù)實(shí)現(xiàn)并行循環(huán)傳輸數(shù)據(jù)

    數(shù)據(jù)經(jīng)過(guò)入隊(duì)列和出隊(duì)列兩個(gè)函數(shù)過(guò)程得到傳遞,本程序使用隊(duì)列函數(shù),實(shí)現(xiàn)兩個(gè)并行循環(huán)的數(shù)據(jù)傳遞。循環(huán) 1生成的數(shù)據(jù)通過(guò)
    發(fā)表于 04-23 09:40

    鴻蒙內(nèi)核源碼分析(調(diào)度隊(duì)列篇):進(jìn)程和Task的就緒隊(duì)列對(duì)調(diào)度的作用

    為何單獨(dú)講調(diào)度隊(duì)列?鴻蒙內(nèi)核代碼中有兩個(gè)源文件是關(guān)于隊(duì)列的,一個(gè)是用于調(diào)度的隊(duì)列,另一個(gè)是用于線程通訊的IPC
    發(fā)表于 11-23 11:09

    Linux現(xiàn)有的所有進(jìn)程IPC方式

    在開(kāi)始回答前,先簡(jiǎn)單概括性地說(shuō)說(shuō)Linux現(xiàn)有的所有進(jìn)程IPC方式:1. **管道:**在創(chuàng)建時(shí)分配一個(gè)page大小的內(nèi)存,緩存區(qū)大小比較有限;2. 消息隊(duì)列:信息復(fù)制兩次,額外的CPU消耗
    發(fā)表于 08-20 06:17

    怎樣通過(guò)匿名管道去實(shí)現(xiàn)進(jìn)程的通信呢

    進(jìn)程通信是指什么?怎樣通過(guò)匿名管道去實(shí)現(xiàn)進(jìn)程的通信呢?有哪些步驟?
    發(fā)表于 12-24 06:45

    哪些方式可以實(shí)現(xiàn)Linux系統(tǒng)下的進(jìn)程通信

    哪些方式可以實(shí)現(xiàn)Linux系統(tǒng)下的進(jìn)程通信?進(jìn)程與線程有哪些不同之處呢?
    發(fā)表于 12-24 06:38

    OpenHarmony進(jìn)程是如何傳遞大數(shù)據(jù)的

    (OsQueueDbgInitHook() != LOS_OK) {//調(diào)試隊(duì)列使用的.return LOS_ERRNO_QUEUE_NO_MEMORY;}return LOS_OK;}總結(jié):消息隊(duì)列解決任務(wù)大數(shù)據(jù)的傳遞,以
    發(fā)表于 05-23 17:13

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

    1、RT-thread內(nèi)核之進(jìn)程通信特性及使用場(chǎng)合介紹  rt-thread操作系統(tǒng)的IPC(Inter-ProcessCommunication,進(jìn)程同步與通信)包含有中斷鎖、調(diào)
    發(fā)表于 09-01 15:13

    進(jìn)程與線程的通信方式

    進(jìn)程的通信則不同,它的數(shù)據(jù)空間的獨(dú)立性決定了它的通信相對(duì)比較復(fù)雜,需要通過(guò)操作系統(tǒng)。以前進(jìn)程的通信只能是單機(jī)版的,現(xiàn)在操作系統(tǒng)都繼承了基于套接字(socket)的
    的頭像 發(fā)表于 04-09 15:58 ?8877次閱讀
    <b class='flag-5'>進(jìn)程</b><b class='flag-5'>間</b>與線程<b class='flag-5'>間</b>的通信方式

    使用MQTT作為進(jìn)程通信的方式

    小編對(duì)Linux這一塊的實(shí)際開(kāi)發(fā)經(jīng)驗(yàn)雖然還不是很足,但也知道進(jìn)程通信有那么幾種方式:管道、消息隊(duì)列、共享內(nèi)存、套接字等。
    的頭像 發(fā)表于 10-22 12:09 ?6021次閱讀
    使用MQTT作為<b class='flag-5'>進(jìn)程</b><b class='flag-5'>間</b>通信的方式

    鴻蒙內(nèi)核源碼分析:進(jìn)程和Task的就緒隊(duì)列對(duì)調(diào)度的作用

    鴻蒙內(nèi)核代碼中有兩個(gè)源文件是關(guān)于隊(duì)列的,一個(gè)是用于調(diào)度的隊(duì)列,另一個(gè)是用于線程通訊的IPC隊(duì)列。 鴻蒙內(nèi)核
    發(fā)表于 11-23 15:48 ?31次下載
    鴻蒙內(nèi)核源碼分析:<b class='flag-5'>進(jìn)程</b>和Task的就緒<b class='flag-5'>隊(duì)列</b>對(duì)調(diào)度的作用

    常見(jiàn)的進(jìn)程通信方式

    關(guān)系的進(jìn)程間使用。進(jìn)程的親緣關(guān)系,通常指父子進(jìn)程關(guān)系。 有名管道: 有名管道也是,半雙工的通信方式,但是它允許無(wú)親緣關(guān)系進(jìn)程
    的頭像 發(fā)表于 10-08 15:48 ?1283次閱讀
    常見(jiàn)的<b class='flag-5'>進(jìn)程</b><b class='flag-5'>間</b>通信方式

    進(jìn)程通信方式總結(jié)

    進(jìn)程通信(IPC): 進(jìn)程通信的方式有很多,這里主要講到進(jìn)程通信的六種方式,分別為:管道、
    的頭像 發(fā)表于 11-09 09:25 ?688次閱讀
    <b class='flag-5'>進(jìn)程</b><b class='flag-5'>間</b>通信方式總結(jié)

    如何實(shí)現(xiàn)一套linux進(jìn)程通信的機(jī)制

    我們知道linux的進(jìn)程通信的組件有管道,消息隊(duì)列,socket, 信號(hào)量,共享內(nèi)存等。但是我們?nèi)绻约?b class='flag-5'>實(shí)現(xiàn)一套進(jìn)程
    的頭像 發(fā)表于 11-10 14:56 ?598次閱讀
    如何<b class='flag-5'>實(shí)現(xiàn)</b>一套linux<b class='flag-5'>進(jìn)程</b><b class='flag-5'>間</b>通信的機(jī)制

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

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