共享內存是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); }