訊號量處理相關函式

2021-08-09 01:24:20 字數 1916 閱讀 9788

訊號量處理函式:semget()

使用格式:

#include

int  semget(key_t  _key ,int  _nsems,int _sem***);

功能:建立乙個新的訊號量或獲取乙個已經存在的訊號量的鍵值。

返回值:成功返回訊號量的標識碼id。失敗返回-1;

引數:_key  為整型值,使用者可以自己設定。有兩種情況:

1.鍵值是ipc_private,該值通常為0,意思就是建立乙個僅能被程序給我的訊號量。 2.

鍵值不是ipc_private,我們可以指定鍵值,例如1234;也可以乙個ftok()函式來取得乙個唯一的鍵值。

_nsems 表示初始化訊號量的個數。比如我們要建立乙個訊號量,則該值為1.,建立2個就是2。

_sem***  :訊號量的建立方式或許可權。有ipc_creat,ipc_excl。

ipc_creat如果訊號量不存在,則建立乙個訊號量,否則獲取。

ipc_excl只有訊號量不存在的時候,新的訊號量才建立,否則就產生錯誤。

函式semctl():控制訊號量的函式。

在這個函式中我們可以刪除訊號量或初始化訊號量。

格式:#include

int  semctl(int _semid  ,int _semnum,int _cmd  ……);

功能:控制訊號量的資訊。

返回值:成功返回0,失敗返回-1;

引數:_semid   訊號量的標誌碼(id),也就是semget()函式的返回值;

_semnum,  操作訊號在訊號集中的編號。從0開始。

_cmd    命令,表示要進行的操作。

引數cmd中可以使用的命令如下:

ipc_stat讀取乙個訊號量集的資料結構semid_ds,並將其儲存在semun中的buf引數中。

ipc_set設定訊號量集的資料結構semid_ds中的元素ipc_perm,其值取自semun中的buf引數。

ipc_rmid將訊號量集從記憶體中刪除。

getall用於讀取訊號量集中的所有訊號量的值。

getncnt返回正在等待資源的程序數目。

getpid返回最後乙個執行semop操作的程序的pid。

getval返回訊號量集中的乙個單個的訊號量的值。

getzcnt返回這在等待完全空閒的資源的程序數目。

setall設定訊號量集中的所有的訊號量的值。

setval設定訊號量集中的乙個單獨的訊號量的值。

函式semop()

格式:#include

int    semop(int   semid ,struct    sembuf   *_sops ,size_t  _nsops);

功能:使用者改變訊號量的值。也就是使用資源還是釋放資源使用權。

返回值:成功返回0,失敗返回-1;

引數:_semid : 訊號量的標識碼。也就是semget()的返回值。

_sops是乙個指向結構體陣列的指標。

struct   sembuf;

sem_num:  操作訊號在訊號集中的編號。第乙個訊號的編號為0;

sem_op : 如果其值為正數,該值會加到現有的訊號內含值中。通常用於釋放所控資源的使用權;如果sem_op的值為負數,而其絕對值又大於訊號的現值,操作將會阻塞,直到訊號值大於或等於sem_op的絕對值。通常用於獲取資源的使用權;如果sem_op的值為0,則操作將暫時阻塞,直到訊號的值變為0。

_sem*** ipc_nowait //對訊號的操作不能滿足時,semop()不會阻塞,並立即返回,同時設定錯誤資訊。

ipc_undo //程式結束時(不論正常或不正常),保證訊號值會被重設為semop()呼叫前的值。這樣做的目的在於避免程式在異常情況下結束時未將鎖定的資源解鎖,造成該資源永遠鎖定。

nsops:操作結構的數量,恆大於或等於1。

sem t 等相關函式 訊號量

訊號量的資料型別為結構sem t 它本質上是乙個長整型的數。它的原型為 extern int sem init p sem t sem,int pshared,unsigned int value 標頭檔案為 include sem為指向訊號量結構的乙個指標 pshared不為 0時此訊號量在程序間...

System V 訊號量使用相關函式

在提到posix 訊號量時,指的是二值訊號量或計數訊號量,而system v訊號量指的是入了計數訊號量集 二值訊號量 其值為0或1,類似於互斥鎖,資源被鎖住時為0,資源可用為1 計數訊號量 其值在0和某個限制值之間的訊號量,訊號量的值就是可用資源數 計數訊號量集 乙個或多個訊號量構成乙個集合,集合中...

訊號量函式(semget semop)

引用自 所需標頭檔案 include include include int semget key t key,int nsems,int sem 執行成功則得到乙個訊號量集識別符號 或建立乙個訊號量集物件,出錯返回 1,原因存在error中。key 0 ipc private 會建立新訊號集物件 ...