雖然本文是記錄使用訊號量保證程序的同步與互斥的,但是其實也可以看做是程序之間的通訊問題,為了與前面的保持一致,所以還是叫做 linux程序間通訊了!
程序間通訊的方式有管道、訊息佇列、共享記憶體這些都是程序間的資訊通訊,而訊號量可以理解為程序使用的臨界資源的狀態說明,訊號量主要用於保證同步與互斥
由此可見我們之前用於程序間通訊的管道,訊息佇列,共享記憶體都是臨界資源,管道是核心已經提供了同步與互斥,但是訊息佇列和共享記憶體都是不保證同步與互斥的
訊號量:本質上是一把計數器
如果乙個訊號只有0或者1,那麼這個就是二元訊號量,所以二元訊號量可以實現互斥鎖
p操作:計數器--
v操作:計數器++
訊號量本身也是臨界資源,所以p、v操作必須是原子的
struct
ipc_perm ;
//訊號量集的結構
struct
semid_ds
作用:用於建立訊號量集
#include
#include
#include
intsemget
(key_t key, int nsems, int sem***)
;
key
訊號集的名字,這個與再建立管道、訊息佇列、共享記憶體等用的key是一致的
nsems
訊號集中訊號量的個數,一般為1(訊號集底層就是陣列)
sem***
同建立訊息佇列等一樣的許可權,sem_flags取兩個值,ipc_create
和ipc_excl
,需要配許可權使用
return
成功返回乙個非負整數,即該訊號集的標識碼;失敗返回-1
num_sems:訊號量的數目,
作用:用於控制訊號量集
#include
#include
intshmctl
(int shmid, int semnum, int cmd, ...)
;
shmid
這個就是要控制的訊號量集
semnum
這個是具體要控制的訊號量,因為shmid只能指明是哪乙個訊號量集(陣列),而semnum就是陣列下標
cmd
將要採取的動作(有三個可取值)
作用:修改訊號量集中的值
#include
#include
#include
intsemop
(int semid, struct sembuf *sops, unsigned nsops)
;
semid
這個就是要修改的訊號量集
sops
如下結構體的指標,這個結構體是這樣的:
struct
sembuf;
nsops
訊號量的個數
return
成功返回0,失敗返回1
makefile
test:comm.c main.c
gcc -o $@
$^.phony:clean
clean:
rm -rf $@
comm.c
&&comm.h
&&main.c
#ifndef __comm_h__
#define __comm_h__
#include
#include
#include
#include
#include
#include
#define pathname "."
#define proj_id 0x6666
union semun ;
intcreatesemset
(int nums)
;int
initsem
(int semid, int nums, int initval)
;int
getsemset
(int nums)
;int
p(int semid, int who)
;int
v(int semid, int who)
;int
destorysemset
(int semid)
;#endif
//!__comm_h__
#include
"comm.h"
static
intcommsemset
(int nums, int flags)
int semid = semget(_key, nums, flags);
if(semid < 0)
return semid;
}int
createsemset
(int nums)
intgetsemset
(int nums)
intinitsem
(int semid, int nums, int initval)
return0;}
static
intcommpv
(int semid, int who, int op)
return0;}
intp
(int semid, int who)
intv
(int semid, int who)
intdestorysemset
(int semid)
return ret;
}#include
"comm.h"
intmain()}
else
wait(null);
}destorysemset(semid);
return0;}
開啟pv操作時與未開啟時的對比:
同樣的使用ipcs -s
命令即可檢視訊號量,使用ipcrm -s
即可釋放訊號量資源訊息佇列
共享記憶體
訊號量賞
謝謝你請我喝咖啡
支付寶
程序通訊之訊號量
1 訊號和訊號量 訊號與訊號量是不同的兩種事物。訊號量是用來調協程序對共享資源的訪問的。為了防止出現因多個程式同時訪問乙個共享資源而引發的一系列問 題,通過生成並使用令牌來授權,在任一時刻只能有乙個執行執行緒訪問 的臨界區域。臨界區域是指執行資料更新的 需要獨佔式地執行,而訊號量就可以提供這樣的一種...
程序通訊之訊號量
一 訊號量 訊號燈 概念 訊號量提供一種訪問機制,讓乙個臨界區同一時間只有乙個程序在訪問他,也就是說訊號量用來協調程序對共享資源的訪問的。訊號量是乙個特殊的變數,程式對其訪問都是原子操作,只允許對他進行等待 p 和傳送資訊 v 的操作。最簡單的訊號量只能取0和1的變數,這也是訊號量最常見的一種形式,...
程序通訊之訊號量
程序通訊之訊號量 一 引言 我們知道在一條單軌鐵路上,任何時候在上面只能有一列列車行駛在上面。而管理這條鐵路的系統就是訊號量,任何一列列車必須等到表明可以行駛的訊號確認以後才能進入鐵路。當一列列車進入軌道行駛時,需要將軌道改為禁止其他列車進入,從而防止不知情的列車進入軌道,發生衝突。而當列車行駛完這...