1.簡介:
1.IPC 進程間通信方式:1.管道 2.System V 消息隊列 3.Posix消息隊列 4.遠程過程調用
2.保持進程間的同步操作:1.文件系統 2.記錄上鎖 3.System V信號量 4. Posix 信號量 5.互斥鎖 6.讀寫鎖
3.進程間的信息共享:1.穿過內核,訪問文件系統的文件信息 2.共享駐留於內核的信息 3.共享內存區
4.IPC對象的持續性:1.隨着文件系統,2.隨着內核,3.隨着進程持續的
2.Posix IPC:
|
消息隊列 |
信號量 |
共享內存區 |
頭文件 |
<mqueue.h> |
<semaphore.h> |
<sys/mman.h> |
創建、打開或刪除IPC函數 |
mq_open mq_close mq_unlink |
sem_open sem_close sem_unlink |
shm_open shm_unlink |
sem_init sem_destory |
|||
控制IPC操作的函數 |
mq_getattr mq_setattr |
|
ftruncate fstat |
IPC操作函數 |
mq_send mq_receive mq_notify |
sem_wait sem_trywait sem_post sem_getvalue |
mmap munmap |
#include "unpipc.h"
char* px_ipc_name(const char* name)
{
char* dir,*dst,*slash;
if((dst = malloc(PATH_MAX))==NULL) return NULL;//分配失敗
if((dir=getenv("PX_IPC_NAME"))==NULL)
{//目錄名
#ifdef POSIX_IPC_PREFIX
dir = POSIX_IPC_PREFIX;
#else
dir = "/tmp/";
#endif
}
slash = (dir[strlen(dir)-1] == '/')?"":"/";
snprintf(dst,PATH_MAX,"%S%S%S",dir,slash,name);//全路徑名稱
return dst;
}
說明 |
mq_open |
sem_open |
shm_open |
只讀 |
O_RDONLY |
|
O_RDONLY |
只寫 |
O_WRONLY |
|
|
讀寫 |
O_RDWR |
O_RDWR |
|
若不存在則創建 |
O_CREAT |
O_CREAT |
O_CREAT |
排他性創建 |
O_EXCL |
O_EXCL |
O_EXCL |
非阻塞模式 |
O_NONBLOCK |
|
|
若已存在則截短 |
|
|
O_TRUNC |
1、 創建時賦予該IPC對象的權限位;
2、 所請求的訪問類型(O_RDONLY、O_WRONLY或O_RDWR);
3、 調用進程的有效用戶ID、有效組ID以及各個輔助組ID;
執行權限測試的步驟:
1、 如果當前進程的有效用戶ID爲0,那就允許訪問;
2、 在當前的進程的有效用戶ID等於該IPC對象屬主ID的前提下,如果相應的用戶訪問權限位已設置,那就允許訪問,否則就拒絕訪問;
3、 當前進程的有效組ID或它的某個輔助組ID等於該IPC對象的組ID的前提下,如果相應的組訪問權限已設置,那就允許訪問,否則拒絕訪問;
4、 如果相應的其他用戶訪問權限已設置,那就允許訪問,否則拒絕訪問。
3.System V IPC
2、key_t鍵和ftok函數
三種類型的IPC使用key_t值作爲他們的名字,頭文件<sys/types.h>把key_t定義爲一個整數,通常是一個至少32位的整數,由ftok函數賦予的。函數ftok把一個已存的路徑和一個整數標識符轉換成一個key_t值,稱爲IPC鍵。函數原型如下:
#include <sys/types.h>#include <sys/ipc.h>
key_t ftok(const char *pathname, int proj_id); //成功返回IPC鍵,出錯返回-1
3、ipc_perm結構
內核給每個IPC對象維護一個信息結構,內容跟內核給文件維護的信息類似。Unix下結構信息如下:
struct ipc_perm
{
key_t key; /* Key supplied to semget(2) */
uid_t uid; /* Effective UID of owner */
gid_t gid; /* Effective GID of owner */
uid_t cuid; /* Effective UID of creator */
gid_t cgid; /* Effective GID of creator */
unsigned short mode; /* Permissions */
unsigned short seq; /* Sequence number */
};
4、創建與打開IPC通道
對於key值,有兩種選擇:
(1)調用fotk函數,給它傳遞pathname和id。
(2)指定key爲IPC_PRIVATE,保證會創建一個新的、唯一的IPC對象。
5、標識符重用
System V IPC 標識符是系統範圍的,不是特定於進程的。ipc_perm結構含有一個名爲seq的變量,是內核爲系統每個潛在的IPC對象維護的計數器,每當刪除一個IPC對象時,內核就遞增相應的槽位號,若溢出則循環到0。這樣避免短時間內重用System V IPC標識符,有助於確保過早終止的服務器重新啓動後不會重用標識符。
6、ipcs和ipcrm程序
System V IPC的三種類型不是以文件系統中的路徑名標識的,不能使用ls和rm程序查看和刪除。而是同ipcs程序輸出System V IPC特性的各種信息,ipcrm則刪除一個System V 消息隊列、信號量或共享內存區。
ipcs - 分析消息隊列、共享內存和信號量
ipcs [-mqs] [-abcopt] [-C core] [-N namelist]
-m 輸出有關共享內存(shared memory)的信息
-q 輸出有關信息隊列(message queue)的信息
-s 輸出信號量(semaphore)的信息
ipcrm -m|-q|-s shm_id
-m 輸出有關共享內存(shared memory)的信息
-q 輸出有關信息隊列(message queue)的信息
-s 輸出信號量(semaphore)的信息