国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

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

2019-10-26 18:53:36
字體:
來源:轉載
供稿:網友

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

一、什么是消息隊列

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

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

二、在Linux中使用消息隊列

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

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

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

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

特點:

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

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

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

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

下面用代碼實現消息隊列的創建:

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

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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永福县| 肥西县| 白水县| 北安市| 于都县| 绥江县| 永平县| 丹东市| 洞头县| 襄汾县| 苏尼特右旗| 三江| 凌海市| 庆安县| 鄂托克前旗| 江西省| 长丰县| 边坝县| 双牌县| 宣威市| 永年县| 康乐县| 香港| 安国市| 博兴县| 眉山市| 景谷| 九台市| 开鲁县| 定州市| 平利县| 扶绥县| 沅陵县| 杭锦旗| 龙里县| 东阳市| 东宁县| 金乡县| 嵩明县| 荆州市| 莱州市|