訊號量的本質是一種資料操作鎖,本身不具有資料交換的功能,而是通過控制其他的共享資源(如共享記憶體)來實現程序間通訊,其本身只是一種外部資源的標識,負責保證程序間通訊的同步與互斥機制
生命週期不隨程序,隨核心(與訊息佇列類似),也存在兩個命令ipcs -s(檢視系統中的訊號量);ipcrm -s semid(釋放指定訊號量)
所謂同步與互斥機制,互斥表示對於某一公共資源(也叫臨界資源),在某一時刻只允許乙個訪問者對其進行訪問,對於程序而言則是在同一時刻僅允許乙個程序對當前臨界資源進行訪問操作,但是互斥無法限制訪問者對臨界資源的訪問順序,也就是說至於那個程序會占用資源是看這個程序搶占資源的能力的,訪問是隨機無序的,這樣一來就會有乙個問題,當乙個程序,它訪問資源的優先順序非常高,搶占資源能力非常強,但是此時它不斷的申請鎖,但立馬又釋放鎖,不斷的重複這些無用的操作,但由於它的優先順序非常高,我們又不得不把資源給它,所以這樣一來其他的程序就一直無法得到資源,這也就造成了飢餓問題;所以針對這一點,在互斥的基礎上,我們又加上了同步機制,即實現了對資源的有序訪問,讓每個程序都有機會能夠申請到資源
訊號量與互斥鎖,條件變數的區別在於前者針對於程序間的同步與互斥,而後者則是針對於執行緒間的同步與互斥
對於訊號量操作的介面如下:
int semget(key_t key,int num_sems,int sem_flags);
函式功能:建立乙個訊號量集或獲取乙個已存在的訊號量集
引數:第乙個引數由ftok()獲得;第二個引數表示要建立的訊號量集中訊號量的個數;第三個引數主要有兩個巨集(ipc_creat和ipc_excl)
返回值:若成功,則返回對應訊號量集的識別符號;否則返回-1
int semctl(int sem_id,int sem_num,int cmd,...);
函式功能:用於對指定訊號量集中的訊號量進行操作
引數:第乙個引數表示訊號量集的識別符號;第二個引數表示要進行操作的訊號量集的訊號量對應下標;第三個引數表示要採取的操作(setval表示對訊號量進行初始化,ipc_rmid表示刪除乙個訊號量);若第三個引數是setval,則存在之後的引數(union semun--需要使用者自己設定,用於對訊號量的某些內容進行初始化)
返回值:若成功返回0,否則返回-1
int semop(int sem_id,struct sembuf* sem_opa,size_t num_sem_ops);
函式功能:用於改變訊號量的值(p操作---占用訊號量,v操作---釋放訊號量)
引數:第乙個引數表示訊號量集的識別符號;第二個引數表示struct sembuf的指標(可以看做是乙個對應結構體陣列,用於對訊號量集進行操作);第三個引數表示前面結構體陣列大小即要操作的訊號量個數
返回值:若成功返回0,否則返回-1
struct sembuf;
程序間通訊 訊號量
ipc識別符號和關鍵字 在終端輸入ipcs,可以看到目前系統中所有的ipc資訊 第一列的key就是ipc的關鍵字,第二列是ipc的識別符號。ftok 函式用於獲得乙個ipc的關鍵字,其函式原型是 key t ftok const char pathname,int proj id 下面是乙個訊號量的...
程序間通訊 訊號量
system ipc中,對於每乙個新建的訊號量 訊息佇列 共享記憶體,都有乙個在整個系統中唯一的識別符號。每個標識也都有唯一對應的關鍵字,關鍵字的資料型別為ket t 在終端輸入命令 ipcs 可以看到目前系統中所有的ipc資訊 共享記憶體段 鍵 shmid 擁有者 許可權 位元組 nattch 狀...
程序間通訊 訊號量
訊號量不是ipc 機構,它只是乙個計數器用於不同程序之間或同一程序不同執行緒之間的同步,型別 二元訊號 值為0或 1,1說明有可用資源,0說明此時資源占用,其他程序需等待。計數訊號量 表示可用資源數量。計數訊號量集 由乙個或多個訊號量組成的集合,每乙個都是計數訊號量。訊號量資料結構 include ...