簡介 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; // 文件內容對應的塊數量
};