進程通訊的方式之一是共享內存,現就共享內存的相關函數做一下總結,藉以與讀者共勉,有無之處,還望批評指正
使用的頭文件
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/ipc.h>
分配函數:
int shmget(key_t key, size_t size, int shmflg);
函數成功返回的是申請的共享內存段的ID號,如果不成功返回-1.第一個參數key是表示共享內存區域的一個名字,它可以有兩個值:IPC_PRIVATE 或者 是一個非零的隨機數;當其值被設定爲前者時說明此共享內存區域是新的未使用的;
第二個參數size則是表示分配的共享內存區域的大小;第三個參數表示的是:
IPC_CREAT:是說如果key如果不存在,那麼將會分配共享內存,如果已經存在,而且此時參數IPC_EXCL沒有被設置,此時就會返回key(此時可以用此函數獲取已經存在的共享內存段的ID);
IPC_EXCL :是說如果key已經存在,那麼共享內存分配失敗;
控制函數:
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
第一個參數是共享內存區域的id,第二個參數是說明對共享內存區域的控制類型其值可以是:
IPC_SET:從buf參數中取值,賦值給shmid_ds結構的ipc_perm域;
IPC_STAT:就是查找共享內存段的shmid_ds結構,並把它存到buf裏面;
IPC_RMID:刪除共享內存區域的id ,當最後一個進程離開時刪除此區域;
SHM_LOCK:關閉共享內存區域,超級用戶的進程可以使用此項命令;
SHM_UNLOCK:打開共享內存區域,超級用戶的進程可以使用此項命令;
第三個參數buf是結構shmid_ds的地址;在系統中每一個共享內存段都有一個shmid_ds的結構;
附加共享內存函數:
void *shmat(int shmid, const void *shmaddr, int shmflg);
函數成功執行返回的是附加到進程的那個段的首地址;
第一個參數是爲附加共享內存空間提供的id,第二個參數是附加共享內存區域的首地址,一般爲零,系統自動分配;第三個參數是shmflg它的值可以如下:
SHM_RND:如果函數中第二個參數是零,那麼次標誌說明系統在需要時會自動完成地址的分配;
SHM_RDONLY:如果調用的進程擁有讀權限,那麼系統就會設定這段附件內存空間爲只讀;
推脫共享內存函數:
int shmdt(const void *shmaddr);
去掉進程與shmaddr所指向的內存的聯繫;
工具函數ftok()
key_t ftok( char * filepath, int id );
函數成功執行返回的是一個key,就是內存區域的描述符號,一般來說key的組成是id|filepath產生的索引號;
內存映射函數mmap()
使用頭文件
#inlcude<sys/mman.h>
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
函數執行成功返回文件映射內存成功時的內存區域首地址;各個參數的含義如下:
Start 是申請的內存區域的首地址,他要是0的話,內核就會隨意分配內存起始地址如果不是0,就會在Start的附近進行內存分配;length是分配內存的長度,prot是設置的被映射內存區域的方位權限:
PROT_EXEC: 只能執行
PROT_READ:只能讀
PROT_WRITE:可以讀寫
PROT_NONE:不可訪問
參數flags控制的是對映射內存區域數據的操作是否會影響被映射的文件的內容,
MAP_SHARED:會影響文件內容
MAP_PRIVATE: 不會影響文件內容
MAP_FIXED: 只能按start分配內存映射空間
文件內存映射過程:
打開文件
調用內存映射函數
取消內存映射函數:
int munmap(void *start, size_t length);
Start是函數mmap()的返回值,length是映射區域的大小;
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、