1. 程式人生 > >程序間通訊(三)共享記憶體

程序間通訊(三)共享記憶體

概念:
共享記憶體區是最快的IPC形式。⼀一旦這樣的記憶體對映到共享它的程序的地址空間,這些程序間資料傳遞不再 涉及到核心,換句話說是程序不再通過執⾏行進⼊入核心的系統調⽤用來傳遞彼此的資料。
共享記憶體中的函式:

  • shmget函式:
功能:⽤用來建立共享記憶體 
原型    int shmget(key_t key, size_t size, int shmflg); 
引數    key:這個共享記憶體段名字  
        size:共享記憶體的大小   
	shmflg:由九個許可權標誌構成,它們的⽤用法和建立⽂檔案時使⽤用的mode模式標誌是⼀一樣的 
返回值:成功返回⼀一個⾮非負整數,即該共享記憶體段的標識碼;失敗返回-1
  • shmat函式:
功能:將共享記憶體段連線到程序地址空間 
原型    void *shmat(int shmid, const void *shmaddr, int shmflg); 
引數    shmid: 共享記憶體標識    
	shmaddr:指定連線的地址    
	shmflg:它的兩個可能取值是SHM_RND和SHM_RDONLY 
返回值:成功返回⼀一個指標,指向共享記憶體第⼀一個節;失敗返回-1

說明:

shmaddr為NULL,核⼼心⾃自動選擇⼀一個地址 
shmaddr不為NULL且shmflg⽆無SHM_RND標記,則以shmaddr為連線地址。 
shmaddr不為NULL且shmflg設定了SHM_RND標記,則連線的地址會⾃自動向下調整為SHMLBA的整數倍。
公式:shmaddr - (shmaddr % SHMLBA) 
shmflg=SHM_RDONLY,表⽰示連線操作⽤用來只讀共享記憶體

  • shmdt函式:
功能:將共享記憶體段與當前程序脫離 
原型    int shmdt(const void *shmaddr); 
引數    shmaddr: 由shmat所返回的指標 
返回值:成功返回0;失敗返回-1 
注意:將共享記憶體段與當前程序脫離不等於刪除共享記憶體段

  • shmctl函式
功能:⽤用於控制共享記憶體 
原型    int shmctl(int shmid, int cmd, struct shmid_ds *buf); 
引數    shmid:由shmget返回的共享記憶體標識碼    	
	cmd:將要採取的動作(有三個可取值)
	buf:指向⼀一個儲存著共享記憶體的模式狀態和訪問許可權的資料結構 
返回值:成功返回0;失敗返回-1
命令 說明
IPC_START 把shmid_ds結構中資料設定為共享記憶體的當前關聯值
IPC_SET 在程序由足夠的許可權下,把共享記憶體當前關聯值設定為shim_ds資料結構中給出的值
IPC_RMID 刪除共享記憶體段