訊號量與ipc(管道,fifo,訊息佇列)不同,它是乙個計數器,用於多程序對共享資料物件的訪問。不過訊號量到底是乙個什麼東西呢?簡單來說它就是乙個標誌,實質是乙個數字,用來標記占用資源的程序個數。
對於一些特殊的資源,我們可以利用訊號量來限制程序對檔案資源的訪問,舉個例子
程序a要對檔案f進行操作,但是程序a的動作很慢,在a還沒做完時b程序來了,它也要對f操作,這時檔案f就會因為ab兩個程序同時操作而出現混亂,所以我們要限制程序對檔案的操作許可權,一般我們都遵循先來後到,所以當a程序對f進行操作的時候,我們不能讓其他程序對f進行操作
這裡就可以用到訊號量。首先,核心中的每乙個ipc結構(訊息佇列,訊號量,共享儲存段)都有乙個非負正數的識別符號,這裡我們就有乙個識別符號與訊號量對應。檔案就比作是訊號量,檔名就比作乙個叫鍵值的東西,檔案描述符則是訊號量的識別符號。我們開啟乙個檔案用open函式,用到檔名,而開啟乙個訊號量則用鍵值(與之對應);開啟檔案返回檔案描述符,開啟訊號量返回訊號量識別符號(以後操作該訊號量就可以用這個描述符)
就比方我們現在要開啟乙個訊號量集合,我們可以這樣操作
semid = semget(key, 1, ipc_creat);
semget函式有三個引數,第乙個是訊號量的鍵值,第二個是開啟/建立訊號量集合裡面訊號量的數目,第三個是乙個條件引數,如果對應該鍵值沒有這個訊號量則建立這個訊號量,返回值是這個訊號量集合的識別符號
這裡這個鍵值我們怎麼知道?所以我們還要來確定這個鍵值,理論上鍵值可以是任意正數,但是為了不會重複定義鍵值,我們用ftok函式
key = ftok("/home", 1);
第乙個引數是路徑,第二個引數是專案id(也可以任意),返回的值就是乙個鍵值,於是用這個鍵值就可以利用semget函式開啟/建立乙個訊號量集合了。
我們還可以用semctl函式對這個訊號量集合的數值進行操作
semctl(int semid, int semnum, int cmd, ...);
第乙個引數是訊號量集合的識別符號,第二個引數表示要對這個訊號量集合裡面的第幾個訊號進行操作,第三個是進行什麼操作
cmd可取(常用)
getval
得到訊號量的值
setval
設定訊號量的值
值為1,則表示還允許乙個程序來操作
值為2,則表示
還允許二個程序來操作
。。。
當用訊號量對檔案進行保護的時候,在操作之前要對該訊號量進行-1的操作,具體如下
struct sembuf sops;
sops.sem_num = 0;
sops.sem_op = -1;
semop(semid, &sops, 1);
若這個時候訊號量的值已經為0,則該程序進入等待,直到可以用這個檔案資源為止(即訊號量的值大於0)
當對乙個檔案操作結束後,需要釋放訊號量,即對訊號量進行+1的操作,同-1的操作
sops.sem_num = 0;
sops.sem_op = 1;
semop(semid, &sops, 1);
這樣就可以對檔案的操作進行保護
程序間的通訊 訊號量
什麼是訊號量 訊號量就是乙個計數器,用於表示乙個共享資源可以同時被多少個程序同時訪問的變數。模擬於生活中的例子就是 同一計程車可以為所有人服務。計程車就是資源,需要計程車的一夥人就是程序,這夥人我們稱之為團體。計程車所能載的團體個數就是訊號量。一般情況,計程車只能為乙個團體服務。你不可能讓乙個已經載...
Linux程序間的訊號量
如果用semget建立了乙個新的訊號量集物件時,則semid ds結構成員變數的值設定如下 sem otime設定為0。sem ctime設定為當前時間。msg qbytes設成系統的限制值。sem nsems設定為nsems引數的數值。sem 的讀寫許可權寫入sem perm.mode中。sem ...
程序間的通訊 訊號量
目錄 1.訊號量的作用 2.訊號量的本質 3.訊號量如何實現同步與互斥 4.訊號量的操作步驟 訊號量也是程序間的通訊方式之一,更多的應用於實現程序間的同步與互斥。程序 執行緒安全概念 保證程序間對臨界資源的安全有序訪問,同步保證的是有序,互斥保證的是安全。同步 保證對臨界資源訪問的時序可控性 互斥 ...