1.System V引入了三種高級進程間的通信機制:消息隊列、共享內寸和信號量
IPC對象(消息隊列、共享內存和信號量)存在於內核中而不是文件系統中,由用戶控制釋放,不像管道的釋放由內核控制
IPC對象通過其標識符來引用和訪問,所有IPC對象在內核空間有唯一性標誌ID,在用戶空間的唯一性標識符稱爲key
LINUX IPC 繼承自System IPC
2. System V IPC對象的訪問
IPC對象時全局對象,可用ipcs,ipcrm等命令查看或刪除
ipcs -q: 只顯示消息隊列。
ipcs -s: 只顯示信號量。
ipcs -m: 只顯示共享內存。
ipcs –help: 其他的參數
3.頭文件及函數介紹
頭文件:
#include <sys/types.h> //公共頭文件,聲明瞭key_t類型 #include <sys/ipc.h> //公共頭文件 #include <sys/msg.h> //消息隊列函數的頭文件 #include <sys/sem.h> //信號量函數的頭文件 #include <sys/shm.h> //共享內存函數的頭文件
#include <sys/types.h> #include <sys/ipc.h> key_t ftok(const char *pathname, int proj_id);
- key的31~24位爲ftok函數第二個參數proj_id的低8位。
- key的23~16位爲該文件stat結構中st_dev屬性的低8位。
- key的15~0位爲該文件stat結構中st_ino屬性的低16位。
struct ipc_perm { key_t __key; /* key */ uid_t uid; /* 所有者的有效用戶ID */ gid_t gid; /* 所有者的有效組ID */ uid_t cuid; /* 創造者的有效用戶ID */ gid_t cgid; /* 創造者的有效組ID */ unsigned short mode; /* 權限 */ unsigned short __seq; /* 可忽略 */ };三種IPC機制都有對應的結構體,這些結構體中有一個共同的成員就是這個ipc_perm,用來標識IPC對象的權限。
不同IPC機制之中的很多函數之間有着異曲同工之妙,學會分類,找到各自的相同點和不同點。
分類 | 創建函數 | 控制函數 | 獨立函數 |
---|---|---|---|
消息隊列 | msgget | msgctl | msgsnd,msgrcv |
信號量 | semget | semctl | semop |
共享內存 | shmget | shmctl | shmat,shmdt |
- 創建函數(get函數)創建的是IPC對象的標識符(id),它們以ftok生成的鍵(key)爲參數(以及其他參數)生成。
- 控制函數(ctl函數)控制的是對應IPC數據結構的成員屬性,從而改變IPC對象的狀態。
int msgget(key_t key, int flag); int semget(key_t key, int nsems, int flag); int shmget(key_t key, size_t size, int flag);
- IPC_CREAT 如果key不存在,則創建(類似open函數的O_CREAT)
- IPC_EXCL 如果key存在,則返回失敗(類似open函數的O_EXCL)
- IPC_NOWAIT 如果需要等待,則直接返回錯誤
- ipcmk
- ipcrm
- ipcs
選項 | 描述 |
---|---|
-Q | 創建一個消息隊列 |
-S | 創建信號量,後跟一參數指明數量 |
-M | 創建共享內存,後跟一參數指明大小 |
CTL函數
int msgctl(int msqid, int cmd, struct msqid_ds *buf); int semctl(int semid, int semnum, int cmd, ...); //有三參數和四參數兩種,根據cmd的不同而不同 int shmctl(int shmid, int cmd, struct shmid_ds *buf);
- msqid_ds
- semid_ds
- shmid_ds
IPC_RMID | 刪除消息隊列。只能由其創建者或超級用戶(root)來刪除 |
IPC_SET | 設置消息隊列的屬性。按照buf指向的結構中的值,來設置此IPC對象 |
IPC_STAT | 讀取消息隊列的屬性。取得此隊列的msqid_ds結構,並存放在buf中 |
IPC_INFO | (只有Linux有)返回系統級的限制,結果放在buf中 |