
相關函數
1.創建共享內存shmget
原型:int shmget(key_t key, size_t size, int shmflg) 返回值: 創建成功,則返回一個非負整數,即共享內存標識; 如果失敗,則返回-1.
參數:
key: //程序需要提供一個參數key,它為共享內存段提供一個外部名。(每個IPC對象都與一個鍵 即key相關聯,然后此鍵再由內核變換為標識符)。還有一個特殊的鍵值IPC_PRIVATE, 它用於創建一個只屬於該創建進程的新共享內存,通常不會用到;
該函數原型:void *shmat(int shmid, const void *shmaddr, int shmflg) 返回值:調用成功返回掛載的虛擬地址空間起始地址,失敗返回NULL
參數:
int shmid //是由shmget函數返回的共享內存標識。
const void *shmaddr //指定共享內存連接到當前進程中的地址位置,通常為0,表示讓系統來選擇 共享內存的地址。
int shmflg //是一組標志位,通常為0。它還可取:SHM_RND,用以決定是否將當前共享內存段連接到指定的shmaddr上。該參數和shm_addr聯合使用,用來控制共享內存連接的地址,除非只計划在一種硬件上運行應用程序,否則不要這樣指定。填0讓操作系統自己選擇是更好的方式。
SHM_RDONLY單獨使用則是指讓它使連接的內存段只讀,否則以讀寫方式連接此內存段
3. 與共享內存段分離 shmdt
原型:int shmdt(const void *shmaddr)
參數:
只是使得該共享內存對當前進程不再可用。
4. shmctl 共享內存控制函數
#include <sys/ipc.h> #include <sys/shm.h> 原型: int shmctl(int shmid, int cmd, struct shmid_ds *buf)
參數:
struct shmid_ds { uid_t shm_perm.uid; uid_t shm_perm.gid; mode_t shm_perm.mode; }
簡單使用
簡單用共享內存來再兩進程間交換數據,比如交換一個結構體
代碼如下:

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 #include <string.h> 5 #include <sys/ipc.h> 6 #include <sys/shm.h> 7 typedef struct Stu 8 { 9 int age; 10 char name[10]; 11 }Stu; 12 13 int main( void) 14 { 15 Stu s; 16 strcpy(s.name, "jack"); 17 //創建共享內存段 18 int id = shmget(1234, 8, IPC_CREAT|0644); 19 if( id == -1)perror( " shmget"),exit( 1); 20 //掛載到進程的地址空間 21 Stu* p = ( Stu*)shmat( id, NULL, 0); 22 23 int i =0; 24 while( 1) 25 { 26 s.age = i++; 27 memcpy(p, &s, sizeof(Stu)); //寫到共享段中 28 sleep( 2); 29 } 30 return 0; 31 }

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 #include <sys/ipc.h> 5 #include <sys/shm.h> 6 typedef struct Stu 7 { 8 int age; 9 char name[10]; 10 }Stu; 11 int main( void) 12 { 13 int id = shmget(1234, 8, 0); 14 if( id == -1)perror( " shmget"),exit( 1); 15 16 Stu* p = ( Stu*)shmat( id, NULL, 0); 17 while( 1) 18 { 19 printf(" age= %d, name= %s\n", p->age, p->name); 20 sleep(2); 21 } 22 return 0; 23 }
執行結果如下:
小結
優點:我們可以看到使用共享內存進行進程間的通信真的是方便而高效,而且函數的接口也簡單,數據的共享還使進程間的數據不用傳送,而是直接訪問內存,也加快了程序的效率。同時,它也不像匿名管道那樣要求通信的進程有一定的父子關系。
上面只是共享內存的一些簡單的應用,當多個進程對共享內存進行訪問時,並沒有保證同步,所以我們還需要用其它的機制來實現它的同步機制,要解決此,通常會用到信號量(PV操作)來實現。但要基於此的實現,前提還需要熟悉信號量的操作以及這里的共享內存使用。要用共享內存模擬做出一個帶同步機制"先進先出"的消息通道,對我等萌新並不太容易,所以還得放到以后再實現了。。