Linux IPC基礎

来源:https://www.cnblogs.com/GyForever1004/archive/2018/02/04/8413809.html
-Advertisement-
Play Games

簡介 IPC 主要有消息隊列、信號量和共用記憶體3種機制。和文件一樣,IPC 在使用前必須先創建,使用 ipcs 命令可以查看當前系統正在使用的 IPC 工具: 由以上可以看出,一個 IPC 至少包含 key值、ID值、擁有者、許可權和使用的大小等關鍵信息。如果需要手工刪除某個 IPC 機制,可以使用 ...


簡介

IPC 主要有消息隊列、信號量和共用記憶體3種機制。和文件一樣,IPC 在使用前必須先創建,使用 ipcs 命令可以查看當前系統正在使用的 IPC 工具:

由以上可以看出,一個 IPC 至少包含 key值、ID值、擁有者、許可權和使用的大小等關鍵信息。如果需要手工刪除某個 IPC 機制,可以使用 ipcrm 命令。

key 值和 ID 值

IPC 在實現時編寫使用 key 值作為參數創建,如果在創建時使用相同的 key 值將得到同一個 IPC 對象的 ID,這樣就保證了雙方可以獲取用於傳遞數據的 IPC 機制 ID 值。key 值為一個32位的整型數據。Linux 提供函數 ftok() 來創建 key 值。

#include <sys/types.h>
#include <sys/ipc.h>

/* pathname 為文件路徑名,第2個參數為 int 型變數 */
key_t ftok(const char *pathname, int proj_id);

每個文件都有其自身的屬性,可以通過 stat() 函數讀取,在 ftok() 函數創建 key 值過程中使用了該文件屬性的 st_dev 和 st_ino 。具體構成如下:

如果使用 ftok() 函數的參數是相同的,那麼得到的 key 值是唯一的。所以說兩個進程使用相同的參數創建同類 IPC 的話,就可以實現進程間的通信。

用以下程式來演示 key 值各位的組成:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/stat.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    int arg, key;
    struct stat buf;

    arg = atoi(argv[2]);

    key = ftok(argv[1], arg);

    printf("Key : %x \n\n", key);

    stat(argv[1], &buf);

    printf("argv[2] low 8  bits : %x \n", arg & 0x0ff);
    printf("st_dev  low 8  bits : %x \n", buf.st_dev & 0x0ff);
    printf("st_ino  low 16 bits : %x \n", buf.st_ino & 0x0ffff);

    return 0;
}

運行結果如下:

擁有者及許可權

要訪問任何一個 IPC 工具需要對該 IPC 工具擁有相應的許可權,一個 IPC 工具所具有的 IPC 訪問許可權定義為 struct ipc_perm。其成員定義如下:

補充 stat 結構體:

struct stat {

        mode_t      st_mode;            // 文件對應的模式,文件,目錄等

        ino_t       st_ino;             // inode 節點號

        dev_t       st_dev;             // 設備號碼

        dev_t       st_rdev;            // 特殊設備號碼

        nlink_t     st_nlink;           // 文件的連接數

        uid_t       st_uid;             // 文件所有者

        gid_t       st_gid;             // 文件所有者對應的組

        off_t       st_size;            // 普通文件,對應的文件位元組數

        time_t      st_atime;           // 文件最後被訪問的時間

        time_t      st_mtime;           // 文件內容最後被修改的時間

        time_t      st_ctime;           // 文件狀態改變時間

        blksize_t       st_blksize;     // 文件內容對應的塊大小

        blkcnt_t        st_blocks;      // 文件內容對應的塊數量
};

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.類變數的用途:大家公用的屬性,節省開銷(記憶體) 2.析構函數 在實例釋放和銷毀的時候執行的,通常用於做一些收尾工作,如關閉一些資料庫鏈接和打開的臨時文件 3.私有方法兩個下劃線開頭,聲明該方法為私有方法,不能在類地外部調用。 4.私有屬性兩個下劃線開頭,聲明該屬性為私有,不能在類地外部被使用或直 ...
  • 什麼是Tomcat Tomcat簡單的說就是一個運行JAVA的網路伺服器,底層是Socket的一個程式,它也是JSP和Serlvet的一個容器。 為什麼我們需要用到Tomcat 如果你學過html,css,你會知道你寫的頁面只能自己訪問, 別人不能遠程訪問你寫的頁面 ,Tomcat就是 提供能夠讓別 ...
  • Create the short array at half the size of the byte array, and copy the byte data in: It is the fastest method by far. https://stackoverflow.com/quest ...
  • 本文基於初次或再次嘗試部署.Net Core應用到Linux伺服器上,我嘗試後自我總結的經驗一個簡單的Demo,嘗試部署在Linux伺服器上和跨伺服器訪問資料庫。 一、環境介紹 1、本地使用Visual Studio 2017開發,使用的.NetCore SDK版本為2.1.4; 2、資料庫使用的M ...
  • Quartz 是什麼? Quartz 是作業調度系統,可以集成進其他軟體系統。這裡【作業調度程式】一詞是指,在預定義時間執行(或通知)其他組件的系統。 Quartz 有什麼優點? 靈活,有多種使用方式,可混合使用 輕量,只需很少的配置 容錯性好 具有持久化功能,程式重啟時,可記住已計劃的任務 Qua ...
  • Entity Framework Codefirst的配置步驟: (1) 安裝命令: install-package entityframework (2) 創建實體類,註意virtual關鍵字在導航屬性中的用法 (3) 創建DbContext類,為每個entity set創建一個DbSet; 指定 ...
  • 1. 實現DataGrid column的顯示和隱藏功能; (1). 定義ContextMenu ,該ContextMenu僅可使用於DataGrid的DataGridColumnHeader; (2). 自定義顯示隱藏的制轉換器; 2. 在實現DataGridColumn Filter 功能時,可 ...
  • 本文目錄:1. Tomcat連接器協議類型2. Tomcat與httpd/nginx結合的方式3. Tomcat + nginx4. Tomcat + httpd(mod_jk) 4.1 編譯mod_jk模塊 4.2 配置httpd與tomcat的ajp連接 4.3 通過mod_jk負載均衡tomc ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...