訊號量(semaphore)是linux程序間通訊的一種方式。但是,與其他程序間通訊方式不大相同,主要用途是保護臨界資源(程序互斥)。程序可以根據它判定是否能夠訪問某些共享資源。除了用於訪問控制外,還可用於程序同步。
訊號量的實質是乙個數字。
在程式開始時,設定訊號量為1,先獲取到訊號量的程序將訊號量 -1 使訊號量為0。訊號量為0時,需要獲取它的程序會自動等待,直到正在使用訊號量的程序釋放訊號量即將訊號量 +1,訊號量由0變為1後,其他程序才能重新去獲取訊號量。
也就是說,對訊號量-1是獲取訊號量,對訊號量+1是釋放訊號量。
ipc(程序間通訊)物件是活動在核心級別的一種程序間通訊的工具。存在的ipc物件通過它的識別符號來引用和訪問,這個識別符號是乙個非負整數,它唯一的標識了乙個ipc物件,這個識別符號就叫做「鍵值」。鍵值對於ipc物件就相當於檔名對於檔案一樣。
ipc物件可以是訊息佇列或訊號量或共享記憶體中的任意一種型別。在linux系統中鍵值被宣告成整數,所以可能存在的最大鍵值為65535。這裡鍵值與檔案描述符有所不同。
使用open函式開啟乙個檔案時,返回的檔案描述符的值為當前程序最小可用的檔案描述符陣列的下標。
ipc物件刪除或建立時相應的鍵值的值會不斷增加到最大的值,歸零迴圈分配使用。
指定鍵值:
1.任意指定乙個數
缺點:這個數可能已經被別的ipc物件(訊息佇列,共享記憶體)所使用了,在與新建立的訊號量關聯時就會失敗。
2. 構造乙個盡量不會被別的ipc物件用到的數
方法:使用key_t ftok( char * fname, int id )
鍵值的資料型別為key_t ,也就是int型別。引數fname是訊號量等ipc物件的檔名,可以自擬。引數id是專案id,可以設為1。若檔名和id不同,則鍵值不同。
函式原形:
intsemget(key_t key, int nsems, int sem***);
函式功能:
獲取訊號量集合的識別符號,也可以建立乙個訊號量集合,並獲取識別符號。
所屬標頭檔案:
#include
#include
#include
返回值:若成功,返回訊號量集合的識別符號;若失敗,返回-1.
引數說明:
key:鍵值,標誌訊號量集合。使用ftok函式建立鍵值 key_t ftok(char *fname, int id);
nsems:若本函式建立了新的訊號量集合,建立的訊號量集合中訊號量的數目為nsems。
sem***:標誌,可以取ipc_creat,若key指定的訊號量集合不存在還可以建立乙個訊號量集合。
函式原形:
intsemop(int semid, struct sembuf *sops, unsigned nsops);
函式功能:
操作訊號量集合中的訊號量。
所屬標頭檔案:
#include
#include
#include
返回值:成功返回0,失敗返回-1.
引數說明:
semid:要操作的訊號量集合的識別符號。
nsops:要操作的訊號量的個數
sops:對訊號量進行的操作,1個sembuf只能對應乙個訊號量的操作,因此是sembuf指標,成員如下:
sem_num:表示訊號量在集合中的編號。
sem_op:表示操作,小於0獲取訊號量如+1,大於0釋放訊號量如-1。當訊號量值為0,程序自動等待。
sem_***標誌位,可以為 sem_undo,表明系統自動釋放訊號量
函式原形:
intsemctl(int semid, int semnum, int cmd);
函式功能:
訊號量控制操作函式,當訊號量的值為0時,需要獲取它的程序自動等待,直到訊號量釋放變為1。
所屬標頭檔案:
#include
#include
#include
返回值:若成功,返回值根據cmd引數來定,若失敗,返回-1
引數說明:
semid:訊號量id
semnum:訊號量在集合中的編號
cmd:10種操作之一,如setval設定訊號量值、getvl獲取訊號量的值 等。
1、程序a
/* 公告欄問題,同學a,在黑板上寫下「數學課取消」 */
#include
#include
#include
#include
#include
#include
#include
//公告欄問題,同學a在黑板上寫下「數學課取消」,同學b在黑板上寫下「英語課考試」
//開啟檔案,寫上「數學課」,休息10s,再寫上「取消」,關閉檔案
void main()
2、程序b
/* 公告欄問題,同學b,在黑板上寫下「英語課考試」 */
#include
#include
#include
#include
#include
#include
#include
//開啟檔案,寫上英語課考試,關閉檔案
void main()
一組併發程序進行互相合作、互相等待,使得各程序按一定的順序執行的過程稱為程序間的同步。
1、程序a
/* 生產者和消費者問題,生產者檔案,產生產品檔案production.txt */
#include
#include
#include
#include
#include
#include
#include
//建立產品檔案,休息,寫入資料,關閉檔案
void main()
2、程序b
/* 生產者和消費者問題,消費者檔案,將product.txt剪下到指定資料夾 */
#include
#include
#include
#include
#include
#include
#include
//取走產品檔案
void main()
訊號量程式設計
訊號量sem wait 的使用 閒來無事,我給大家講下unix linux下訊號量函式的使用。首先你得知道什麼叫訊號量,什麼時候要用訊號量。這個嘛,主要就是用來保護共享資源的,也就是說如果你想限制某個 些 資源在同一時刻只能有一 多 個執行緒擁有,就可以使用訊號量。當然也可以用作讓乙個執行緒等待另乙...
訊號量互斥程式設計
訊號量 訊號量 又名 訊號燈 與其他程序間通訊方式不大相同,主要用途是保護臨界資源 程序互斥 程序可以根據它判定是否能夠訪問某些共享資源。除了用於訪問控制外,還可以用於程序同步。訊號量分類 二值訊號量 訊號量的值只能取0或1 計數訊號量 訊號量的值可以取任意非負值 建立 開啟訊號量集合 函式名 se...
訊號量 二值訊號量
訊號量 二值訊號量 訊號量是作業系統的重要部分,訊號量一般用來進行資源管理和任務同步。freertos中訊號量分為二值訊號量 互斥訊號量 計數訊號量和遞迴互斥訊號量,應用場景各不同。二值訊號量通常用於互斥訪問或同步,二值訊號量和互斥訊號量非常相似,但互斥訊號量有優先順序,二值訊號量沒有。因此二值訊號...