一、雞肋
1、訊號量,與其他處理序間通訊方式不同,主要用途是(1)進程互斥(保護臨街資源)(2)進程同步(進程合作)
2、2值訊號量:訊號量的取值只能是0和1,類似於互斥鎖。這裡說類似,是因為訊號和互斥鎖的區別在於:
(1)號誌強調共用資源,只要共用資源可用,其他進程同樣可以修改訊號量的值。
(2)互斥鎖強調進程,佔用資源的進程使用完資源後,必須有本進程來解鎖
3、計數型訊號量:訊號量的可以取任意非負值
二、訊號量使用(這裡的函數都是基於訊號量集合的,就是往往把一個進程中所有的訊號量看成是一個集合):
1、建立/開啟 訊號量:int semget(key_t key,int nsems,int semflg);
(1)參數:
==key: 索引值,由ftok獲得
==nsems: 指定開啟或者新建立的訊號量集合的訊號量數目
==semflg:標識,同訊息佇列
2、操作 訊號量:int semop(int semid,struct sembuf * sops,unsigned nsops)
(1)參數:
==semid:訊號量集的id
==sops:決定將要對訊號量進行的操作,它是一個sembuf結構體類型的數組,(這裡我們用一個結構體類型來指明一種操作)
struct sembuf{
unsigned short sem_num; //指明當前要使用的訊號量屬於訊號量集中的第幾個訊號量
short sem_op; //指明要對該訊號量進行的操作名稱
short sem_flg;//操作的標誌
}
semflg操作標誌可以取的值:
== IPC_NOWAIT:對訊號的操作不能滿足時,semop()不會阻塞,並立即返回,同時設定錯誤資訊
==IPC_UNDO:程式結束時(不論正常還是非正常),釋放訊號量,這樣做的目的在於避免程式在異常情況下結束時未將鎖定資源結束,造成該資源永遠鎖定
==nsops,運算元組sops中元素的個數,即它用來指明,有多少個操作要做