共享記憶體:
共享記憶體是被多個程序共享的一部分物理記憶體。共享記憶體是程序間共享資料的一種最快的方法,乙個程序向共享記憶體區域寫入了資料,共享這個記憶體區域的所有程序就可以立刻看到其中的內容。
建立共享記憶體分為兩步:
1、建立共享記憶體,使用shmget函式
2、對映共享記憶體,將這段建立的共享記憶體對映到具體的程序空間去,使用shmat函式。
案例:
typedef
struct _shm
shm;
int main()
// 2、將共享記憶體對映到當前的程序空間
shm* pshm = (shm*)shmat(shmid, null, 0);
if(pshm == (shm*)-1)
strcpy (pshm->msg, "hello");
// 解除共享記憶體對映,解除是值當前程序不能再使用共享記憶體
shmdt(pshm);
shmctl(shmid, ipc_rmid, null);
return
0;}
用函式shmget和函式shmat可以建立乙個共享記憶體並將它對映到當前的程序空間,而函式shmdt則可以解除共享記憶體的對映,最後的函式shmctl則可以對共享記憶體進行控制,包括刪除共享記憶體的功能。
訊號量:
為了防止出現因多個程式同時訪問乙個共享資源而引發的一系列問題,我們需要一種方法,它可以通過生成並使用令牌來授權,在任一時刻只能有乙個執行程序訪問**的臨界區域。臨界區域是指執行資料更新的**需要獨佔式地執行。而訊號量就可以提供這樣的一種訪問機制,讓乙個臨界區同一時間只有乙個程序在訪問它,也就是說訊號量是用來調協程序對共享資源的訪問的。
訊號量是乙個特殊的變數,程式對其訪問都是原子操作,且只允許對它進行等待(即p(訊號變數))和傳送(即v(訊號變數))資訊操作。最簡單的訊號量是只能取0和1的變數,這也是訊號量最常見的一種形式,叫做二進位制訊號量。而可以取多個正整數的訊號量被稱為通用訊號量。這裡主要討論二進位制訊號量。
由於訊號量只能進行兩種操作等待和傳送訊號,即p(sv)和v(sv),他們的行為是這樣的:
p(sv):如果sv的值大於零,就給它減1;如果它的值為零,就掛起該程序的執行
v(sv):如果有其他程序因等待sv而被掛起,就讓它恢復執行,如果沒有程序因等待sv而掛起,就給它加1.
訊號量的建立:
int semget(key_t key, int num_sems, int sem_flags);
第乙個引數key是整數值(唯一非零),不相關的程序可以通過它訪問乙個訊號量,它代表程式可能要使用的某個資源,程式對所有訊號量的訪問都是間接的,程式先通過呼叫semget函式並提供乙個鍵,再由系統生成乙個相應的訊號識別符號(semget函式的返回值),只有semget函式才直接使用訊號量鍵,所有其他的訊號量函式使用由semget函式返回的訊號量識別符號。如果多個程式使用相同的key值,key將負責協調工作。
第二個引數num_sems指定需要的訊號量數目,它的值幾乎總是1。
第三個引數sem_flags是一組標誌,當想要當訊號量不存在時建立乙個新的訊號量,可以和值ipc_creat做按位或操作。設定了ipc_creat標誌後,即使給出的鍵是乙個已有訊號量的鍵,也不會產生錯誤。而ipc_creat | ipc_excl則可以建立乙個新的,唯一的訊號量,如果訊號量已存在,返回乙個錯誤。
semget函式成功返回乙個相應訊號識別符號(非零),失敗返回-1.
案例:
// 建立乙個訊號量
int sem_id = semget((key_t)5678, 1, 0666 | ipc_creat);
訊號量初始化即p,v操作:
union semun
;// 訊號量的初始化函式
int sem_init(int sem_id)
// 訊號量的 p 操作
int sem_p(int sem_id)
// 訊號量的 v 操作
int sem_v(int sem_id)
這裡我們用到了乙個函式semop來進行訊號量的p, v操作。這其中用到了乙個結構體sembuf,sembuf結構的定義如下:
struct sembuf;
最後可以銷毀訊號量:
int sem_del(int sem_id)
Linux 程序間通訊 共享記憶體 訊號量
shm write.c include include include include include include define max len 512 struct shm def union semun int init sem int sem id,int val int del sem ...
初學Linux 程序間通訊(共享記憶體 訊號量)
基本概念 系統核心分配的一塊儲存區,該記憶體被對映到多個程序的各自的程序位址空間,多個程序都可以對共享記憶體中資料進行跟新。1.程式設計模型 首先用shmget建立乙個共享記憶體,再呼叫shmat將共享記憶體對映至呼叫程序的位址空間。對映完成後通過返回的共享記憶體的讀寫指標進行讀寫,最後呼叫shmd...
linux程序通訊(一) 共享記憶體 訊號量
server.c 向共享記憶體中寫入people include include include include int main int semid int shmid key t semkey key t shmkey semkey ftok server.c 0 shmkey ftok cli...