1、什么是POSIX標準
Portable Operating System Interface for Computing System.
他是一個針對操作系統(tǒng)(準確地說是針對類Unix操作系統(tǒng))的標準化協(xié)議。
這個協(xié)議是對操作系統(tǒng)服務接口的標準化,從而保證了應用程序在源碼層次的可移植性。
如今主流的Linux系統(tǒng)都做到了兼容POSIX標準。
2、POSIX標準的C/C++庫
POSIX 進程間通信 (Interprocess Communication, IPC) 是 System V 進程間通信的變體。它是在 Solaris 7 發(fā)行版中引入的。與 System V 對象類似,POSIX IPC 對象的屬主、屬主的組以及其他用戶具有讀取和寫入權限,但是沒有執(zhí)行權限。POSIX IPC 對象的屬主無法將對象分配給其他屬主。POSIX IPC 包括以下功能:
-
消息允許進程將已格式化的數(shù)據(jù)流發(fā)送到任意進程。
-
信號量允許進程同步執(zhí)行。
與 System V IPC 接口不同,POSIX IPC 接口均為多線程安全接口。
POSIX 消息
下表中列出了 POSIX 消息隊列接口。
表?7-2 POSIX 消息隊列接口
|
POSIX 信號量
POSIX 信號量比 System V 信號量輕得多。POSIX 信號量結(jié)構(gòu)定義單個信號量,而不是定義最多包含 25 個信號量的數(shù)組。
POSIX 信號量接口如下所示。
-
連接到以及(可選)創(chuàng)建命名信號量
-
初始化信號量結(jié)構(gòu)(在調(diào)用程序內(nèi)部,因此不是命名信號量)
-
結(jié)束到開放式信號量的連接
-
結(jié)束到開放式信號量的連接,并在最后一個進程關閉此信號量時將其刪除
-
初始化信號量結(jié)構(gòu)(在調(diào)用程序內(nèi)部,因此不是命名信號量)
-
將信號量的值復制到指定整數(shù)中
、
-
當其他進程擁有信號量時進行阻塞,或者當其他進程擁有信號量時返回錯誤
-
遞增信號量計數(shù)
POSIX 共享內(nèi)存
POSIX 共享內(nèi)存實際上是映射內(nèi)存的變體(請參見)。二者的主要差異在于:
-
打開共享內(nèi)存對象應使用?,而不是通過調(diào)用?。
-
關閉和刪除對象應使用?,而不是通過調(diào)用?,此調(diào)用不刪除對象。
?中的選項數(shù)實際上少于??中提供的選項數(shù)。
?
P
DESCRIPTION
共享內(nèi)存是最快的可用IPC形式。它允許多個不相關(無親緣關系)的進程去訪問同一部分邏輯內(nèi)存。
要注意的是共享內(nèi)存本身沒有提供任何同步功能。也就是說,在第一個進程結(jié)束對共享內(nèi)存的寫操作之前,并沒有什么自動功能能夠預防第二個進程開始對它進行讀操作。共享內(nèi)存的訪問同步問題必須由程序員負責??蛇x的同步方式有互斥鎖、條件變量、讀寫鎖、紀錄鎖、信號燈。
實際上,進程之間在共享內(nèi)存時,并不總是讀寫少量數(shù)據(jù)后就解除映射,有新的通信時,再重新建立共享內(nèi)存區(qū)域。而是保持共享區(qū)域,直到通信完畢為止。
?
POSIX Shared Memory API
使用POSIX共享內(nèi)存需要用到下面這些API:
#include <sys/types.h> #include <sys/stat.h> /* For mode constants */ #include <sys/mman.h> #include <fcntl.h> /* For O_* constants */ #include <unistd.h> int shm_open(const char *name, int oflag, mode_t mode); int shm_unlink(const char *name); int ftruncate(int fildes, off_t length); void *mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off); int munmap(void *addr, size_t len); int close(int fildes); int fstat(int fildes, struct stat *buf); int fchown(int fildes, uid_t owner, gid_t group); int fchmod(int fildes, mode_t mode);
shm_open
穿件并打開一個新的共享內(nèi)存對象或者打開一個既存的共享內(nèi)存對象, 與函數(shù)open的用法是類似的. 函數(shù)返回值是一個文件描述符,會被下面的API使用.
ftruncate
設置共享內(nèi)存對象的大小,新創(chuàng)建的共享內(nèi)存對象大小為0.
mmap
munmap
shm_unlink
刪除一個共享內(nèi)存對象名字.
close
當shm_open函數(shù)返回的文件描述符不再使用時,使用close函數(shù)關閉它.
fstat
獲得共享內(nèi)存對象屬性的stat結(jié)構(gòu)體. 結(jié)構(gòu)體中會包含共享內(nèi)存對象的大小(st_size), 權限(st_mode), 所有者(st_uid), 歸屬組 (st_gid).
fchown
改變一個共享內(nèi)存對象的所有權.
fchmod
改變一個共享內(nèi)存對象的權限.
?
Persistence(持續(xù)性)
POSIX 共享內(nèi)存隨內(nèi)核持續(xù):?共享內(nèi)存對象會一直存在,直到系統(tǒng)關閉 或者 一個進程取消內(nèi)存映射(unmapped)并且調(diào)用shm_unlink來刪除共享內(nèi)存對象.
Linking(鏈接庫)
必須鏈接rt(librt)庫,也就是real-time library.
-lrt
?
Accessing shared memory objects via the file system
Linux從內(nèi)核2.4 和glibc 2.2版本開始支持POSIX共享內(nèi)存.
?
從Linux內(nèi)核2.6.19版本起, Linux支持使用訪問控制列表(ACLs) 來控制虛擬文件系統(tǒng)中對象的權限.
?
Inherit
to be continued...
?
CONFORMING TO(遵守的彼岸準)
POSIX.1-2001.
?
NOTES
多進程必須使用同步機制來訪問共享內(nèi)存對象, 比如使用POSIX信號量.
System V 的共享內(nèi)存是過時的, POSIX共享內(nèi)存提供了使用更簡單、設計更合理的API.
?