通過訊號量達到程序對資源占用的互

2021-08-02 21:20:08 字數 1529 閱讀 2723

訊號量與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.訊號量的操作步驟 訊號量也是程序間的通訊方式之一,更多的應用於實現程序間的同步與互斥。程序 執行緒安全概念 保證程序間對臨界資源的安全有序訪問,同步保證的是有序,互斥保證的是安全。同步 保證對臨界資源訪問的時序可控性 互斥 ...