欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Linux消息隊列實現進程間通信實例詳解

 更新時間:2017年07月10日 10:26:28   作者:ChaseRaod  
這篇文章主要介紹了Linux消息隊列實現進程間通信實例詳解的相關資料,需要的朋友可以參考下

Linux消息隊列實現進程間通信實例詳解

一、什么是消息隊列

消息隊列提供了一種從一個進程向另一個進程發(fā)送一個數據塊的方法。  每個數據塊都被認為含有一個類型,接收進程可以獨立地接收含有不同類型的數據結構。我們可以通過發(fā)送消息來避免命名管道的同步和阻塞問題。但是消息隊列與命名管道一樣,每個數據塊都有一個最大長度的限制

Linux用宏MSGMAX和MSGMNB來限制一條消息的最大長度和一個隊列的最大長度。

二、在Linux中使用消息隊列

Linux提供了一系列消息隊列的函數接口來讓我們方便地使用它來實現進程間的通信。它的用法與其他兩個System V PIC機制,即信號量和共享內存相似。

進程間通信(IPC):進程間通信的本質就是通過讓不同的進程看到一份公共的資源來實現通信。

常用的進程間通信的方式有兩種:通過管道和systemv標準,今天我們來介紹systemv標準中的一種:消息隊列

消息隊列:消息隊列提供了一種從一個進程向另一個進程發(fā)送一個數據塊的方法,每個數據塊都認為是有一個類型,接受者進程接收的數據塊可以有不同的類型值。我們可以通過發(fā)送消息來避免命名管道的同步和阻塞問題。

特點:

(1)消息隊列可認為是全局的一個鏈表,由消息隊列標識符進行標識。
(2)消息隊列允許一個或多個進程寫入或讀取消息
(3)消息隊列的聲明周期隨內核
(4)消息隊列可以實現雙向通信

創(chuàng)建一個消息隊列:msget()
這里寫圖片描述
第一個參數:每一個消息隊列都有唯一的key值,可以由ftok()產生

第二個參數:一般由兩個選項IPC_CREAT和IPC_EXCL,單獨使用ipc_creat時,如果消息隊列不存在則創(chuàng)建一個,如果存在則打開 IPC_EXCL 如果同時使用,如果消息隊列不存在則創(chuàng)建之,如果存在則出錯返回。當單獨使用IPC_EXCL時,沒有意義。

ftok:
這里寫圖片描述
參數可由用戶指定。

下面用代碼實現消息隊列的創(chuàng)建:

在創(chuàng)建一個消息隊列(其他ipc相同)時,需要先通過文件路徑名和項目ID獲取一個鍵值,然后通過此鍵值由內核生成標識符,在以后可通過此標識符來使用此消息隊列。
這里寫圖片描述

為什么要有key值和標識符兩個值呢?

描述符是對于用戶操作而言的,讓用戶感覺操作和對文件的操作相同,key是對于系統(tǒng)內部說的。

我們使用ftok來創(chuàng)建key值,具體可以man一下fotk函數,大概是這樣的:按給定的路徑名取得其stat結構,從該結構中取出部分st_dev和st_ino字段,然后再與項目id組合起來,如果兩個路徑名引用兩個不同的文件,那么,對這兩個路徑名調用ftok通常返回不同的key值,但是,因為i節(jié)點號和key通常都存放在長整型中,于是創(chuàng)建key時可能會丟失信息,這意味著,如果使用同一項目id,那么對于不同文件的兩個路徑名可能產生相同的key值。而標識符是唯一確定的,可以用來區(qū)別于其他ipc的。

刪除消息隊列:msgctl()
這里寫圖片描述
代碼實現:
這里寫圖片描述

發(fā)送消息:msgsnd()

接收消息:magrcv(),這兩個函數實現進程間的雙向通信
這里寫圖片描述 

參數:msqid-消息隊列標識碼

msgp-指向消息緩沖區(qū)的指針,此位置是用來暫時存儲發(fā)送和接收的消息,是一個用戶可定義的通用結構。
msgtyp-從消息隊列內讀取的消息形態(tài)。如果值為0,則表示消息隊列中,所有消息被讀取。
msgsz:消息的大小

返回值:成功返回0,失敗則返回-1.
這里寫圖片描述

那么如何查看系統(tǒng)中正在運行的消息隊列呢?

介紹兩個命令:ipcs -q 查看消息隊列

ipcrm -q msgid 刪除此消息隊列
這里寫圖片描述

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關文章

  • 5個Shell腳本編程入門練習例子

    5個Shell腳本編程入門練習例子

    這篇文章主要介紹了5個Shell腳本編程入門例子,涵蓋了各種操作,又有一些游戲的性質,作為入門練習例子是不很不錯的,需要的朋友可以參考下
    2014-06-06
  • Shell腳本中$符號的嵌套使用方法小結

    Shell腳本中$符號的嵌套使用方法小結

    在編寫Shell腳本時,通過嵌套使用$符號,間接獲取變量或表達式的值的具體方法,文中根據實例編碼詳細介紹的十分詳盡,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2023-05-05
  • 詳解shell中>/dev/null 2>&1到底是什么

    詳解shell中>/dev/null 2>&1到底是什么

    這篇文章主要介紹了shell中>/dev/null 2>&1到底是什么,文中介紹的很詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-02-02
  • Shell+Linux命令實現日志分析

    Shell+Linux命令實現日志分析

    這篇文章主要介紹了Shell+Linux命令實現日志分析,本文給出了結合grep命令、awk命令等實現了幾個常用的日志分析統(tǒng)計長命令,需要的朋友可以參考下
    2014-08-08
  • Linux 編程之進程fork()詳解及實例

    Linux 編程之進程fork()詳解及實例

    這篇文章主要介紹了Linux 編程之進程fork()詳解及實例的相關資料,需要的朋友可以參考下
    2017-03-03
  • Shell腳本檢查IP格式及mysql操作實例

    Shell腳本檢查IP格式及mysql操作實例

    這篇文章主要介紹了Shell腳本檢查IP格式及mysql操作實例,本文直接給出腳本代碼,需要的朋友可以參考下
    2015-05-05
  • shell中的for循環(huán)用法詳解

    shell中的for循環(huán)用法詳解

    這篇文章主要介紹了shell中的for循環(huán)用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • centos/rhel下實現nginx自啟動腳本實例

    centos/rhel下實現nginx自啟動腳本實例

    這篇文章主要介紹了centos/rhel下實現nginx自啟動腳本,需要的朋友可以參考下
    2014-07-07
  • shell 提取文件名和目錄名的方法實現

    shell 提取文件名和目錄名的方法實現

    本文主要介紹了shell 提取文件名和目錄名的方法實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • Linux shell知識點匯總

    Linux shell知識點匯總

    從程序員的角度來看, Shell本身是一種用C語言編寫的程序,從用戶的角度來看,Shell是用戶與Linux操作系統(tǒng)溝通的橋梁。用戶既可以輸入命令執(zhí)行,又可以利用 Shell腳本編程,完成更加復雜的操作。
    2015-08-08

最新評論