System V 訊號量使用相關函式

2022-06-29 01:33:09 字數 2257 閱讀 9140

在提到posix 訊號量時,指的是二值訊號量或計數訊號量,而system v訊號量指的是入了計數訊號量集

二值訊號量:其值為0或1,類似於互斥鎖,資源被鎖住時為0,資源可用為1

計數訊號量:其值在0和某個限制值之間的訊號量,訊號量的值就是可用資源數

計數訊號量集:乙個或多個訊號量構成乙個集合,集合中每個元素都是計數訊號量(每個集合的訊號量數存在乙個限制)

核心為每個訊號量集維護的資訊結構

#include struct

semid_ds;

struct

sem;

#include //

建立乙個訊號量集或訪問乙個已存在的訊號量集

//成功返回非負訊號量識別符號,出錯返回-1

int semget(key_t key, int nsems, int

oflag);

//key: ipc 鍵

//nsems:指定集合中訊號量數

//oflag:sem_r(讀)和sem_a(改)的組合,還可以按位與ipc_creat或ipc_creat|ipc_excl

#include //

對訊號量集中乙個或多個訊號量進行操作

//成功返回0,出錯返回-1

int semop(int semid, struct sembuf *opsptr, size_t nops);

//semid:由semget()函式返回的訊號量識別符號

//nops: 指出opsptr指向的結構陣列的元素數量

//opsptr:指向乙個如下的陣列

struct

sembuf;

//sembuf結構內元素的排列順序並不保證如上述那樣,只保證該結構中有上述三個元素

//sembuf結構不能靜態初始化(struct sembuf value =

//error)

//sembuf結構需要執行時初始化(struct sembuf value; value.sem_num = 0; ...)

//sem_op:每個特定的操作有sem_op確定,它可以是負數、0、正數

//sem_op為正數時,其值加到semval(訊號量當前值)上,對應於釋放訊號量控制的資源

//如果指定了sem_undo標誌,就從相應訊號量的semadj(所指定訊號量針對呼叫程序的調整值)減去sem_op

//sem_op為0,呼叫者等待semval變為0,如果semval已經為0,則立即返回

//sem_op為負數,呼叫者希望等待semval變為大於或等於sem_op的絕對值,這對應於分配資源

#include //

對乙個訊號量執行各種控制操作

//成功返回非負值,出錯返回-1

int semctl(int semid, int semnum, int cmd, ... /*

union semun arg

*/);

//semid: 標識其操作待控制的訊號量集

//semnum: 標識訊號量集內的某個成員(sem_base[sem_num])

//cmd:可選值如下(除非另外說明,操作成功函式返回值為0,出錯為-1)

//getval:將semval的當前值作為函式返回值返回

//setval:將semval設為arg.val(若操作成功,那麼相應訊號量的semadj被設為0)

//getpid:將sempid的當前值作為函式返回值返回

//getncnt:將semncnt(等待semval變為大於其當前值的執行緒數)的當前值作為函式返回值返回

//getzcnt:將semzcnt(等待semval變為0的執行緒數)的當前值作為函式返回值返回

//getall:返回指定訊號量集內每個成員的semval值(這些值通過arg.array指標返回)

//setall:設定指定訊號量集內每個成員的semval值(這些值通過arg.array指標傳遞)

//ipc_rmid:將由semid指定的訊號量集從系統刪除

//ipc_set:設定指定訊號量集的semid_ds結構中的sem_perm.uid、sem_perm.gid、sem_perm.mode,這些值由arg.buf引數指向的結構中的相應成員指定

//ipc_stat:返回指定訊號量集當前的semid_ds結構(通過arg.buf)

//arg: 可選引數,根據 cmd 引數而定

union semun;

systemV訊號量 與 Posix訊號量

一 函式上的區別 訊號量有兩種實現 傳統的system v訊號量和新的posix訊號量。它們所提供的函式很容易被區分 對於所有system v訊號量函式,在它們的名字裡面沒有下劃線。例如,應該是semget 而不是sem get 然而,所有的的posix訊號量函式都有乙個下劃線。下面列出了它們提供的...

systemV訊號量的使用案例

systemv訊號量處理的函式有 semget semctl semop include intsemget key t key int nsems,int sem 說明 解釋功能 建立乙個新的訊號量或獲取乙個已經存在的訊號量的鍵值。返回值成功返回訊號量的標識碼id 失敗返回 1。引數 解釋 key...

linux 之 system v 訊號量

計數器,記錄可以訪問共享資源的次數。保護共享資源 硬體裝置,檔案,共享記憶體等等 訊號量大於0,則可以訪問 訊號量等於0,則不可以訪問。訪問時會將訊號量減1,訪問完成會將訊號量加1。加1減1可由使用者控制 訊號量減小到0之後,程序就不能去訪問共享資源了。int semget key t key,in...