1. 程式人生 > >程序間的通訊(一)訊息佇列

程序間的通訊(一)訊息佇列

訊息佇列

  訊息佇列是儲存訊息的線性表,是訊息在傳輸過程中的容器,訊息佇列一經建立,即可以向佇列中寫入指定型別訊息,其他程序可以從該佇列中取出指定型別的訊息。
  訊息是程序間通訊的資料內容,在訊息佇列機制中,訊息是有型別的,也就是說,一條訊息不僅包括資料,也包括訊息的型別資訊,對於同一個訊息佇列來說,可以儲存不同型別的資訊,程序可以根據需要從訊息佇列中取出自己需要的型別資訊。
  這裡寫圖片描述

訊息佇列的特點

  1.訊息佇列中的訊息是有型別的,傳送訊息時可以指定型別,接受訊息時,可以按照訊息型別從佇列中讀取資訊
  2.訊息按照發送的順序排隊,相同型別的訊息,先入隊的訊息先被接收。
  3. IPC機制的作用範圍是整個系統範圍內,而不限於程序,也就是說,一旦IPC物件被建立,除非顯示的刪除該物件或者系統重啟,否則該物件一直存在,而程序內開啟的檔案在程序退出後自動關閉,IPC物件不存在關閉的概念,程序退出後,IPC物件仍然存在,其中資料也不變。

訊息佇列的控制

  1.首先系統能建立多少個訊息佇列,我們可以用命令檢視:

cat/proc/sys/kernel/msgmni

  2.其次每條訊息佇列中最多能裝多少位元組的訊息:

cat/proc/sys/kernel/msgmnb

  3.如何建立一條訊息佇列:我們用函式msgget 可以做到

 int msgget(key_t key, int msgflg); //函式原型

  建立一個新的佇列時,flag選用引數IPC_CREAT,獲取一個已經存在的訊息佇列識別符號時,將該引數設定為0
   返回值:-1(失敗),訊息佇列建立滿或者嘗試開啟1別人的訊息
       id(成功),標識已經開啟的訊息佇列,返回可用的識別符號
   4.如何用命令檢視或者刪除我們我們建立的訊息佇列:

ipcs -q//檢視當前目錄下的訊息佇列
ipcrm -Q key//刪除關鍵字key的訊息佇列

  5.建立好訊息佇列後,那麼我們如何向佇列中寫入資料以及讀取資料

//寫入資料選用函式msgsnd
int msgsnd(int msqid, //訊息佇列的識別符號,通常由msgget獲得
           const void *msgp, //想寫入訊息佇列資料的地址
           size_t msgsz, //訊息的大小
           int msgflg);//一般設定為0
//讀取資料選用函式msgrcv
 ssize_t msgrcv(int msqid,
                void
*msgp, //接收的資訊存放位置 size_t msgsz, //接收訊息的地方大小 long msgtyp,//接收那個通道的訊息 int msgflg);//一般設定為0

  6.例項程式碼:

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<string.h>
typedef struct{
    long channel;
    char mtext[256];
}mf;
int main()
{
    mf mb; 
    int id=msgget(123,IPC_CREAT|0645);//建立訊息佇列
    memset(&mb,0x00,sizeof(mb));//初始化緩衝區
    printf("input channel:");
    scanf("%d",&mb.channel);
    char buf[]="pangdun is a beautiful girl";                                                                                         
    memcpy(mb.mtext,buf,sizeof(buf));
    msgsnd(id,(const void*)&mb,sizeof(buf),0);//寫入資料
    printf("%s\n",mb.mtext);
    return 0;
}

相關推薦

Linux環境程序通訊 訊息佇列(轉)

轉自http://www.ibm.com/developerworks/cn/linux/l-ipc/part3/, 作者:鄭彥興訊息佇列(也叫做報文佇列)能夠克服早期unix通訊機制的一些缺點。作為早期unix通訊機制之一的訊號能夠傳送的資訊量有限,後來雖然 POSIX 1003.1b在訊號的實時性方面作了

程序通訊IPC——訊息佇列

IPC(Inter-Process Communication)程序間通訊,提供了各種程序間通訊的方法。在Linux C程式設計中有幾種方法 (1) 半雙工Unix管道 (2) FIFOs(命名管道) (3) 訊息佇列 (4) 訊號量 (5) 共

程序通訊訊息佇列

訊息佇列   訊息佇列是儲存訊息的線性表,是訊息在傳輸過程中的容器,訊息佇列一經建立,即可以向佇列中寫入指定型別訊息,其他程序可以從該佇列中取出指定型別的訊息。   訊息是程序間通訊的資料內容,在訊息佇列機制中,訊息是有型別的,也就是說,一條訊息不僅包括資料

人工智慧PythonNet—— 程序通訊管道、訊息佇列、共享記憶體、訊號、訊號量、套接字

一、程序間通訊        程序間通訊(IPC,InterProcess Communication)是指在不同程序之間傳播或交換資訊。        由於每個程序的空間是互相獨立的,程序之間無法互相直接獲取彼此的資源,故引入程序間通訊來實現程序間的資源互動。       

Android IPC程序通訊檔案共享

IPC程序間通訊簡介 1.在AndroidManifest.xml中宣告元件android:process屬性。 不指定process屬性,則預設執行在主程序中,主程序名字為包名。 android:process = package:remote,將執行在package:remote程序

Linux環境程序通訊 管道及有名管道(轉)

管道是Linux支援的最初Unix IPC形式之一,具有以下特點:管道是半雙工的,資料只能向一個方向流動;需要雙方通訊時,需要建立起兩個管道;只能用於父子程序或者兄弟程序之間(具有親緣關係的程序);單獨構成一種獨立的檔案系統:管道對於管道兩端的程序而言,就是一個檔案,但它不是普通的檔案,它不屬於某種檔案系統,

Android 8.0系統原始碼分析--Binder程序通訊

 開始我們的沉澱之路,老羅的書中第二章講的是Android HAL層的知識,而且直接自己實現了一個虛擬的freg驅動程式,後面的幾節是分別從native、java層如何訪問這個虛擬的驅動程式介面,我這裡沒有這樣的環境,所以就不分析這節了,第三章的智慧指標我對比8.0系統原

Qt程序通訊--------QProcess

       Qt提供了一個QProcess類用於啟動一個外部程式並與之通訊。啟動一個新程序的操作十分簡單,只需要將待啟動的程式名稱和啟動引數傳遞給start()函式即可。 m_pPro = new

Linux程序通訊——管道、訊號量

一、Linux程序間通訊方式 :有六種方式在兩個程式間傳遞資訊         1、訊號( Singal )         2、管道 ( Pipe ) 及有名管道         3、訊號量 (

程序通訊IPC-管道、訊息佇列、共享記憶體、訊號、訊號量、套接字

多程序:首先,先來講一下fork之後,發生了什麼事情。由fork建立的新程序被稱為子程序(child process)。該函式被呼叫一次,但返回兩次。兩次返回的區別是子程序的返回值是0,而父程序的返回值則是新程序(子程序)的程序 id。將子程序id返回給父程序的理由是:因為一

【Linux】程序通訊IPC訊息佇列詳解及測試用例

學習環境 Centos6.5 Linux 核心 2.6 什麼是訊息佇列? 訊息佇列是SystemV版本中三種程序通訊機制之一,另外兩種是訊號量和共享儲存段。訊息佇列提供了程序間傳送資料塊的方法,而且每個資料塊都有一個型別標識。訊息佇列是基於訊息的,而管

細說linux IPC:基於socket的程序通訊

    【版權宣告:尊重原創,轉載請保留出處:blog.csdn.net/shallnet 或 .../gentleliu,文章僅供學習交流,請勿用於商業用途】     在一個較大的工程當中,一般都會有多個程序構成,各個功能是一個獨立的程序在執行。既然多個程序構成一個工程,

Linux程序通訊IPC方式總結

程序間通訊概述 程序通訊的目的 資料傳輸  一個程序需要將它的資料傳送給另一個程序,傳送的資料量在一個位元組到幾M位元組之間 共享資料  多個程序想要操作共享資料,一個程序對共享資料 通知事件 一個程序需要向另一個或一組程序傳送訊息,通知它(它們)

異數OS 織夢師-水母--訊息佇列

異數OS 織夢師-水母(一)–訊息佇列篇 本文來自異數OS社群 github: https://github.com/yds086/HereticOS 異數OS社群QQ群: 652455784 異數OS-織夢師(訊息中介軟體)群: 476260389 織夢師-水母

程序通訊命名管道fifo

要學習命名管道,我們必須首先對管道的特性有一定的瞭解,管道特性以及匿名管道連結 命名管道:管道的一個限制就是隻能用在親緣程序之間,如果我們想在不相關的程序間進行資料交換,可以使用FIFO檔案來進行,它叫做命名管道。 命名管道:檔案系統可見,是一個特殊型別(管道型別)的檔案。命名管

程序通訊共享記憶體

概念: 共享記憶體區是最快的IPC形式。⼀一旦這樣的記憶體對映到共享它的程序的地址空間,這些程序間資料傳遞不再 涉及到核心,換句話說是程序不再通過執⾏行進⼊入核心的系統調⽤用來傳遞彼此的資料。 共享記憶體中的函式: shmget函式: 功能:⽤用來建立共享記憶體 原型

Android IPC程序通訊 Binder連線池

Binder管家之Binder連線池 IPC程序間通訊(四)之AIDL中的AIDL由一個Service進行管理,若是建立10個AIDL業務模組是不是也要建立10個Service來進行管理,那100個呢?顯然繁瑣,怎麼辦麼,用Binder連線池呀! 工作機制: 1.每個業務模組建立其AID

Android IPC程序通訊Socket

網路通訊之Socket 特點:功能強大,可通過網路傳輸位元組流,支援一對多併發即時通訊。 不支援RPC。 服務端實現: public class SorviceSocket extends Service { private static final String TAG

Androi IPC程序通訊ContentProvider

程序間通訊之ContentProvider 一,介紹 1.底層實現也是Binder 2.其6個方法除了onCreate方法運行於主執行緒,其他4個方法由外界回撥並運行於Binder執行緒池。 3.註冊ContentProvider需要一個屬性android:authorities=“XX

Android IPC程序通訊AIDL

AIDL-Android介面定義語言 一· 1.相比於Messenger AIDL可跨程序呼叫方法。 2.支援資料型別: (1) Java 的原生基本型別(int, long, char, boolean, double等) (2)String 和CharSequence (3) Arr