国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux進(jìn)程通信之消息隊(duì)列

這篇具有很好參考價(jià)值的文章主要介紹了Linux進(jìn)程通信之消息隊(duì)列。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

1.消息隊(duì)列的原理:

2.消息隊(duì)列的接口:

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

? ? ? ? (2)向消息隊(duì)列發(fā)送消息

? ? ? ? (3)接收消息

? ? ? ? ?(4)操作消息隊(duì)列的接口


1.消息隊(duì)列的原理:

消息隊(duì)列(messagequeue)以鏈表作為基礎(chǔ),實(shí)現(xiàn)消息隊(duì)列,由操作系統(tǒng)維護(hù)該鏈表

操作系統(tǒng)中,使用消息隊(duì)列描述符(qid)來區(qū)分每個(gè)消息隊(duì)列(qid是唯一的)

進(jìn)程在消息隊(duì)列的末尾增加消息,需要信息的進(jìn)程按照所需的類型在隊(duì)列中取消息

Linux進(jìn)程通信之消息隊(duì)列

2.消息隊(duì)列的接口:

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

Linux進(jìn)程通信之消息隊(duì)列

? ? ? ? int megget(key_t,int msgflg)

參數(shù):?

key:消息隊(duì)列的標(biāo)識(shí)符

megflg:創(chuàng)建的標(biāo)志,如IPC_CREAT

IPC_CREAT :如果不存在就創(chuàng)建,按位或上一個(gè)權(quán)限

返回值:

成功:返回隊(duì)列ID

失敗:返回-1,并設(shè)置erron?

2)向消息隊(duì)列發(fā)送消息? ? ??

Linux進(jìn)程通信之消息隊(duì)列

?

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg)

參數(shù):

msqid:消息隊(duì)列的ID

msgp:指向msgbuf的指針,用來發(fā)送指定的消息,在寫msgsnd、msgrev函數(shù)時(shí),要提前定義該結(jié)構(gòu)體,主要是指定mtext大小。

? ? ? msgp指向的msgbuf為發(fā)送的結(jié)構(gòu)體,操作系統(tǒng)指定了函數(shù)發(fā)送消息的格式,只定義了一部分,mtext可以由程序員自己改變。

Linux進(jìn)程通信之消息隊(duì)列

?msgsz:要發(fā)送的消息的長(zhǎng)度,該參數(shù)的值不是表示msgp指向的msgbuf結(jié)構(gòu)體的大小,而是該結(jié)構(gòu)體中mtext的大小。

msgflg:創(chuàng)建標(biāo)記,如果指定了IPC_NOWAIT,失敗會(huì)立即返回。? ? ? ?

? ? ? ? ?0:阻塞發(fā)送

? ? ? ? ?IPC_NOWAIT:非阻塞發(fā)送

返回值:

? ? ? ? 0:成功

? ? ? ? -1:失敗,并設(shè)置errno

(3)接收消息

ssize_t msgrcv(int msqid , void *msgp,size_t msgsz,long msgtyp,int msgflg)

參數(shù):

msgid:消息隊(duì)列的ID

msgp:指向msgbuf的指針,用來接收消息

**struct? msgbuf{……}為輸出型參數(shù)

msgsz:需要接受的消息的長(zhǎng)度,注意msgsz是由msgp所指向的結(jié)構(gòu)體的成員 mtext的最大大小決定的(byte)

msgtyp有三種形式:

? ? ? ? 1.msgtyp=0:讀取隊(duì)列的第一個(gè)消息

? ? ? ? 2.msgtyp>0:讀取隊(duì)列類型為msgtyp的第一條消息,除非在msgflg中指定了 MSG_EXCEPT,否則將讀取類型不等于 megtyp的隊(duì)列中的第一條消息,

? ? ? ? 3.msgtyp<0:讀取隊(duì)列中最小類型小于或等于msgtyp絕對(duì)值的第一條消息

msgflg:創(chuàng)建標(biāo)記,若指定了IPC_NOWAIT,獲取失敗后就直接返回?

?? ? (4)操作消息隊(duì)列的接口

int msgctl(int msqid , int cmd, struct msqid_ds *buf)

參數(shù):

? ? ? ? msqid:消息隊(duì)列的ID

? ? ? ? cmd:控制命令:

? ? ? ? ? ? ? ? IPC_RMID,刪除命令

? ? ? ? ? ? ? ? IPC_STAT,獲取命令

? ? ? ? buf:存儲(chǔ)隊(duì)列的相關(guān)信息的buf

返回值:

? ? ? ? 成功:根據(jù)不同的cmd有不同的返回值

? ? ? ? 失敗: 返回-1,并設(shè)置errno

5.代碼實(shí)現(xiàn):

寫端發(fā)送消息,讀端從隊(duì)列讀取

mesgrcv:

#include<stdio.h>
#include<unistd.h>
#include<sys/msg.h>
#include<sys/ipc.h>

struct msgbuf
{
   long mtype;
   char mtext[1024];

};


int main()
{
 int msg_id=msgget(0x06060606,IPC_CREAT|0664);
 if(msg_id<0 )
{
 perror("msgget \n" );
return 0;
}

printf("msggqueued id is %d\n",msg_id );
struct msgbuf mq;
msgrcv(msg_id,&mq,sizeof(mq.mtext),1,0);
printf("接受的消息:%s \n",mq.mtext);

return 0;
}

msgsnd:

#include<stdio.h>
#include<unistd.h>
#include<sys/msg.h>

struct msgbuf
{
     long mtype;        //message type
     char mtext[512];   //message data

};

int main()
{
 int msg_qid=msgget(0x06060606,IPC_CREAT|0664);
 if(msg_qid<0 )
  {
    perror("msgget\n");
  return 0;
  }

  struct msgbuf mq;

  int i;
  for(i=0;i<10;i++)
 {
   mq.mtype=i+1;
   sprintf(mq.mtext,"%s,%d ","xxxxxxxxxx ",i+1);
   msgsnd(msg_qid,&mq,sizeof(mq.mtext),0);
 }

return 0;
}

查看系統(tǒng)中的message queue:

Linux進(jìn)程通信之消息隊(duì)列?

?Linux進(jìn)程通信之消息隊(duì)列

當(dāng)多次讀出時(shí),由于消息已經(jīng)出了隊(duì)列,所以不能再讀出。文章來源地址http://www.zghlxwxcb.cn/news/detail-455352.html

到了這里,關(guān)于Linux進(jìn)程通信之消息隊(duì)列的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Linux進(jìn)程間通信 - 信號(hào)(signal) 與 管道(pipe) 與 消息隊(duì)列

    Linux進(jìn)程間通信 - 信號(hào)(signal) 與 管道(pipe) 與 消息隊(duì)列

    什么是進(jìn)程間通信,就是進(jìn)程與進(jìn)程之間進(jìn)行通信,互相發(fā)送消息;可以通過 信號(hào) 或者 管道 或者 消息隊(duì)列 或者 信號(hào)量 去通信! 目錄 一、信號(hào) 1. 信號(hào)簡(jiǎn)介? 2. 都有那些信號(hào)? 3. 注冊(cè)信號(hào)的函數(shù) 1). signal 2). sigaction (項(xiàng)目中強(qiáng)烈推薦使用) 4. 信號(hào)發(fā)送 1). kill 函數(shù) 2). alarm 函

    2024年02月01日
    瀏覽(19)
  • 【Linux】進(jìn)程間通信——system V共享內(nèi)存 | 消息隊(duì)列 | 信號(hào)量

    【Linux】進(jìn)程間通信——system V共享內(nèi)存 | 消息隊(duì)列 | 信號(hào)量

    共享內(nèi)存是一種在多個(gè)進(jìn)程之間進(jìn)行進(jìn)程間通信的機(jī)制。它允許多個(gè)進(jìn)程訪問相同的物理內(nèi)存區(qū)域,從而實(shí)現(xiàn)高效的數(shù)據(jù)交換和通信。 因?yàn)?進(jìn)程具有獨(dú)立性(隔離性) ,內(nèi)核數(shù)據(jù)結(jié)構(gòu)包括對(duì)應(yīng)的代碼、數(shù)據(jù)與頁表都是獨(dú)立的。OS系統(tǒng)為了讓進(jìn)程間進(jìn)行通信,必須讓不同的進(jìn)

    2024年02月15日
    瀏覽(23)
  • Linux之進(jìn)程間通信——system V(共享內(nèi)存、消息隊(duì)列、信號(hào)量等)

    Linux之進(jìn)程間通信——system V(共享內(nèi)存、消息隊(duì)列、信號(hào)量等)

    本文介紹了另一種進(jìn)程間通信——system V,主要介紹了共享內(nèi)存,消息隊(duì)列、信號(hào)量,當(dāng)然消息隊(duì)列了信號(hào)量并非重點(diǎn),簡(jiǎn)單了解即可。 共享內(nèi)存 :不同的進(jìn)程為了進(jìn)行通信看到的同一個(gè)內(nèi)存塊,該內(nèi)存塊被稱為共享內(nèi)存。 進(jìn)程具有獨(dú)立性,它的內(nèi)核數(shù)據(jù)結(jié)構(gòu)包括對(duì)應(yīng)的代

    2024年02月08日
    瀏覽(28)
  • 進(jìn)程間通信 + 消息隊(duì)列

    進(jìn)程間通信 + 消息隊(duì)列

    每個(gè)進(jìn)程有各自不同的用戶地址空間,任何一個(gè)進(jìn)程的全局變量在另一個(gè)進(jìn)程中都看不到,所以進(jìn)程之間要交換數(shù)據(jù)必須通過內(nèi)核,在內(nèi)核中開辟一塊緩沖區(qū),進(jìn)程1吧數(shù)據(jù)從用戶空間考到內(nèi)核緩沖區(qū),進(jìn)程2再?gòu)膬?nèi)核緩沖區(qū)吧數(shù)據(jù)讀走,內(nèi)核提供的這種機(jī)制成為進(jìn)程間通信 管

    2024年02月09日
    瀏覽(14)
  • 【linux】進(jìn)行間通信——共享內(nèi)存+消息隊(duì)列+信號(hào)量

    【linux】進(jìn)行間通信——共享內(nèi)存+消息隊(duì)列+信號(hào)量

    進(jìn)程間通信方式目前我們已經(jīng)學(xué)了匿名管道,命名管道。讓兩個(gè)獨(dú)立的進(jìn)程通信,前提是看到同一份資源。匿名管道適用于血緣關(guān)系的進(jìn)程,一個(gè)打開寫端一個(gè)打開讀端實(shí)現(xiàn)的。命名管道適用于完全獨(dú)立的進(jìn)程,打開同一份文件實(shí)現(xiàn)的。 接下來我們看看剩下的實(shí)現(xiàn)進(jìn)程間通信

    2024年02月05日
    瀏覽(21)
  • Laravel 隊(duì)列監(jiān)聽Superviso進(jìn)程管理(消息隊(duì)列后臺(tái)監(jiān)聽)

    在 Ubuntu 系統(tǒng)上,可以使用以下命令安裝 Supervisor: 在CentOS: 安裝完成后,Supervisor 的配置文件會(huì)被放置在? /etc/supervisor/conf.d/ ?目錄下 在? /etc/supervisor/conf.d/ ?目錄下創(chuàng)建一個(gè)新的配置文件,例如? laravel-worker.conf : 編輯配置文件: 在打開的文件中,添加以下配置: 運(yùn)行以

    2024年02月02日
    瀏覽(19)
  • Qt共享內(nèi)存實(shí)現(xiàn)進(jìn)程間消息隊(duì)列

    在Qt 5.9中,可以使用Qt的跨進(jìn)程通信機(jī)制來實(shí)現(xiàn)進(jìn)程間的消息隊(duì)列。這個(gè)機(jī)制是通過Qt的QSharedMemory、QSystemSemaphore和QSharedMemory類來實(shí)現(xiàn)的。 首先,你需要?jiǎng)?chuàng)建一個(gè)消息隊(duì)列的服務(wù)器端和客戶端。服務(wù)器端負(fù)責(zé)接收和處理消息,客戶端負(fù)責(zé)發(fā)送消息。 服務(wù)器端的代碼示例如下:

    2024年02月09日
    瀏覽(15)
  • 消息隊(duì)列(11) - 通信協(xié)議的設(shè)計(jì)

    消息隊(duì)列(11) - 通信協(xié)議的設(shè)計(jì)

    對(duì)于我們客戶端與服務(wù)器之間的通信協(xié)議我們約定如下: 具體的協(xié)議設(shè)計(jì): 之后我們傳遞的參數(shù)也是這些 關(guān)于 type其實(shí)是在描述當(dāng)前這個(gè)請(qǐng)求 、 響應(yīng)是在調(diào)用那個(gè)API 約定如下 對(duì)于channel ,是tcp鏈接中的一個(gè)邏輯上的鏈接,一個(gè)TCP可以有多個(gè)Channel,存在的意義是為了讓TCP得到復(fù)用

    2024年02月13日
    瀏覽(16)
  • 項(xiàng)目實(shí)戰(zhàn) — 消息隊(duì)列(8){網(wǎng)絡(luò)通信設(shè)計(jì)①}

    項(xiàng)目實(shí)戰(zhàn) — 消息隊(duì)列(8){網(wǎng)絡(luò)通信設(shè)計(jì)①}

    目錄 一、自定義應(yīng)用層協(xié)議 ?? 1、格式定義 ?? 2、準(zhǔn)備工作 ??定義請(qǐng)求和響應(yīng)? ??? 定義BasicArguments ?? 定義BasicReturns ?? 2、創(chuàng)建參數(shù)類 ?????????? 交換機(jī) ?????????? 隊(duì)列 ?????????? 綁定 ? ? ? ? ??發(fā)布消息 ? ? ? ? ?? 訂閱消息 ? ? ? ? ??確認(rèn)應(yīng)答

    2024年02月13日
    瀏覽(17)
  • 在Python中優(yōu)雅地用多進(jìn)程:進(jìn)程池 Pool、管道通信 Pipe、隊(duì)列通信 Queue、共享內(nèi)存 Manager Value

    在Python中優(yōu)雅地用多進(jìn)程:進(jìn)程池 Pool、管道通信 Pipe、隊(duì)列通信 Queue、共享內(nèi)存 Manager Value

    Python 自帶的多進(jìn)程庫 multiprocessing 可實(shí)現(xiàn)多進(jìn)程。我想用這些短例子示范如何優(yōu)雅地用多線程。中文網(wǎng)絡(luò)上,有些人只是翻譯了舊版的 Python 官網(wǎng)的多進(jìn)程文檔。而我這篇文章會(huì)額外講一講下方加粗部分的內(nèi)容。 創(chuàng)建進(jìn)程 Process, fork 直接繼承資源,所以初始化更快,spawn 只

    2024年02月16日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包