共用記憶體是LUNIX 系統中最底層的通訊機制,也是最快速的通訊機制。共用記憶體通過兩個或多個進程共用同一塊記憶體地區來實現進程間的通訊。通常是由一個進程建立一塊共用
記憶體地區,然後多個進程可以對其進行訪問,一個進程將要傳出的資料存放到共用記憶體中,另一個或多個進程則直接從共用記憶體中讀取資料。因此這種通訊方式是最高效的處理序間通訊方式。但實際的問題在於,當兩個或多個進程使用共用記憶體進行通訊時,同步問題的解決顯得尤為重要,否則就會造成因不同進程同時讀寫一塊共用記憶體中的資料而發生混亂。在通常的情況下,通過使用訊號量來實現進程的同步。
以上兩個程式是一個處理序間通訊的例子。這兩個程式分別在不同的進程中運行,使用了共用記憶體進行通訊。b從鍵盤讀入資料,存放在共用記憶體中。a則從共用記憶體中讀取資料,顯示到螢幕上。由於沒有使兩個進程同步,顯示的內容將是雜亂無章的,對這一問題的處理將在進一步學習有關同步的操作之後完成。
執行個體b程式負責向共用記憶體中寫入資料,a程式負責從記憶體中讀出共用的資料,它們之間並沒有添加同步操作。
b.c
#include <sys/types.h>#include <sys/ipc.h> #include <sys/shm.h> #include <stdio.h> #define BUF_SIZE 1024 #define MYKEY 25 int main() { int shmid; char *shmptr; if((shmid = shmget(MYKEY,BUF_SIZE,IPC_CREAT)) ==-1) { printf("shmget error \n"); exit(1); } if((shmptr =shmat(shmid,0,0))==(void *)-1) { printf("shmat error!\n"); exit(1); } while(1) { printf("input:"); scanf("%s",shmptr); } exit(0); }
a.c
#include <stdio.h> #include <sys/types.h>#include <sys/ipc.h> #include <sys/shm.h> #define BUF_SIZE 1024 #define MYKEY 25 int main() { int shmid; char * shmptr; if((shmid = shmget(MYKEY,BUF_SIZE,IPC_CREAT)) ==-1) { printf("shmget error!\n"); exit(1); } if((shmptr = shmat(shmid,0,0)) == (void *)-1) { printf("shmat error!\n"); exit(1); } while(1) { printf("string :%s\n",shmptr); sleep(3); } exit(0); }
查看全套文章:http://www.bianceng.cn/Programming/C/201212/34807.htm