2021-05-12 14:32:11
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
相關文章