標籤:
訊號量互斥
訊號量(又名:號誌)與其他處理序間通訊方式不大相同,主要用途是保護臨界資源(進程互斥)。進程可以根據它判定是否能夠訪問某些共用資源。除了用於存取控制外,還可用於進程同步。
一、訊號量分類
二值號誌:號誌的值只能取0或1
計數號誌:號誌的值可以取任意非負值。
二、函數學習
2.1建立/開啟訊號量
2.1.1 函數名
semget
2.1.2 函數原形
int semget(key_t key,int nsems,int semflg);
2.1.3 函數功能
擷取訊號量集合標示符
當key所指定的訊號量不存在的時候,並且semflg裡麵包含了IPC_CREAT,這個時候就會建立一個訊號量集合
2.1.4 所屬標頭檔
<sys/types.h> <sys/ipc.h> <sys/sem.h>
2.1.5 傳回值
成功:返回訊號量集合的表示符
失敗:-1
2.1.6 參數說明
key:索引值
nsems:建立的這個訊號量集合裡麵包含的訊號量數目
semflg:標誌,可以取IPC_CREAT
2.2指定索引值
系統建立IPC通訊(處理序間通訊)必須指定一個ID值 。
1.任意指定一個數
缺點:這個數已經被別的IPC對象(訊息佇列,共用記憶體)所使用了,在與新建立的訊號量關聯時就會失敗。
2. 構造一個盡量不會被別的IPC對象用到的數
方法:使用key_t ftok( char * fname, int id )
2.2.1 函數名
ftok
2.2.2 函數原形
key_t ftok( char * fname, int id )
2.2.3 函數功能
構造一個盡量不會被別的IPC對象用到的數
2.2.4 所屬標頭檔
<sys/types.h><sys/ipc.h>
2.2.5 傳回值
索引值
2.2.6 參數說明
fname就是指定的檔案名稱(已經存在的檔案名稱)
id是子序號。雖然是int類型,但是只使用8bits(1-255)。
2.3操作訊號量
2.3.1 函數名
semop
2.32 函數原形
int semop(int semid,struct sembuf *sops,unsigned nsops);
2.3.3 函數功能
操作訊號量集合裡面的訊號量
2.3.4 所屬標頭檔
<sys/types.h><sys/ipc.h><sys/sem.h>
2.3.5 傳回值
成功:0
失敗:-1
2.3.6 參數說明
int semid:要操作的訊號量集合的標示符
struct sembuf *sops:要操作多個訊號量
unsigned nsops:對訊號量執行什麼樣的操作
訊號量互斥,王明學learn