首頁 > 軟體

Linux IPC入門基礎知識

2020-06-16 16:55:22
簡介

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 nn", 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;      // 檔案內容對應的塊數量
};

本文永久更新連結地址http://www.linuxidc.com/Linux/2018-02/150771.htm


IT145.com E-mail:sddin#qq.com