//***************====訊號量
**********===
訊號量:主要來實現程序間或執行緒間的同步(也可以實現互斥)
訊號量的值:表示資源的可用量。
訊號量操作流程:
1:建立乙個訊號量集合
param 2:訊號量集合中訊號量的個數
int semid
int semget(key_t key, int nsems, int sem***);
semid = semget(key, 1, ipc_creat|0666);
2:對訊號量進行初始化
param 2:要操作的訊號量在集合中的下標
param 3:你要進行什麼操作,就選擇什麼命令
int semctl(int semid, int semnum, int cmd, ...);
1)、完成對訊號量集的初始化
(單個訊號量
:cmd = setval,
多個訊號量同時初始化:
cmd = setall)
2)、獲取訊號量的值
(cmd = getval)
3)、刪除訊號量集(
cmd = ipc_rmid)
//需要使用者自己定義
union semun {
int val; /* value for setval */
struct semid_ds *buf; /* buffer for ipc_stat,ipc_set*/
unsigned short *array; /* array for getall, setall */
struct seminfo *__buf; /* buffer for ipc_info*/
//將訊號量集合中第乙個
sem的值初始化為1
union semun sem_p;
sem_p.val = 1;
semctl(semid, 0, setval, sem_p);
//將訊號量集中兩個訊號量:
sem1
和sem2
的值分別初始化為10和
5 union semun sem_p;
unsigned short array_sem[2];
array_sem[0] = 10;
array_sem[1] = 5;
sem_p.array = array_sem;
semctl(semid, 0, setall, sem_p);
//獲取訊號量集中下標為
1的訊號量的值;
int val;
union semun sem_p;
unsigned short array_sem[2];
sem_p.array = array_sem;
val = semctl(semid, 1, getval); //獲取乙個訊號量的值
semctl(semid, 0, getall, sem_p);//一次可以獲取多個訊號量的值
3:實現
pv 函式
//***************===pv操作
****************************************===
param 2:實現
pv操作的控制
param 3:實現
pv操作的訊號量的個數
int semop(int semid, struct sembuf *sops, unsigned nsops);
//該結構體不需要使用者自定義
struct sembuf {
unsigned short sem_num; /* 下標*/
short sem_op; /* -1:p操作
1:v操作 */
short sem_***; /*一般填
0 */
//實現
sem訊號量的p操作
struct sembuf buf;
buf.sem_num = 0;//下標
buf.sem_op = -1;
buf.sem_*** = 0;
semop(semid, &buf, 1);
//實現
sem訊號量的v操作
struct sembuf buf;
buf.sem_num = 0;//下標
buf.sem_op = 1;
buf.sem_*** = 0;
semop(semid, &buf, 1);
//將訊號量集中兩個訊號量:
sem1實現p
操作、sem2實現v
操作。
struct sembuf buf[2];
buf[0].sem_num = 0;//下標
buf[0].sem_op = -1;
buf[0].sem_*** = 0;
buf[1].sem_num = 1;//下標
buf[1].sem_op = 1;
buf[1].sem_*** = 0;
semop(semid, buf, 2);
4:在適當地方進行
pv操作
5:刪除訊號量集
semctl(semid, 0, ipc_rmid);
IPC程序間通訊(訊號量)
訊號量是乙個計數器,用於為多個程序提供對共享資料物件的訪問。訊號量和p v原語操作是由dijkstra 迪傑斯特拉 所提出的。執行p操作時,將該程序狀態設定為等待狀態,並把 該程序的pcb插入相應的等待佇列s.queue末尾 執行v操作時,喚醒相應等待佇列s.queue中等待的乙個程序 改變其狀態為...
程序間通訊(IPC)之 訊號量
一.訊號量 在談論訊號量之前,先要提到臨界資源和臨界區的概念,臨界資源是指多個程序訪問但乙個時間段內只允許乙個程序獨佔的資源,而臨界區是指多個程序訪問臨界資源的這一段公共的 訊號量的本質是一種資料操作鎖,也可以說就是乙個計數器,它本身並不能提供對程序間的通訊,而是通過控制某一資源來完成程序間的互斥和...
LINUX程序間通訊(IPC) 訊號量
三 demo 父子程序的訊號量 在對於臨界區資源管理的過程中,多個程式同時訪問乙個共享資源經常容易引發一系列問題 如死鎖,結果不唯一等等,使用訊號量,來解決程序或執行緒間共享資源引發的同步問題。讓多個程序通過特殊變數展開互動,乙個程序在某乙個關鍵點上被迫停止執行直至接收到對應的特殊變數值,通過這一措...