systemV訊號量的使用案例

2021-10-10 12:48:20 字數 4519 閱讀 5820

systemv訊號量處理的函式有:semget();semctl();semop();

#include

intsemget

(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只有訊號量不存在的時候,新的訊號量才建立,否則就產生錯誤。

#include

intsemctl

(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設定訊號量集中的乙個單獨的訊號量的值。

semunion ;第4個引數是可選的;semunion :是union semun的例項。

union semun 

;//下面是給乙個訊號量初始化的**。

union semun sem_args;

unsigned

short array[1]

=;sem_args.array = array;

ret =

semctl

(semid,

0, setall, sem_args)

;//0代表對1個訊號來量初始化,即有1個資源if(

-1== ret)

#include

intsemop

(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。

源程式1

#include

#include

#include

#include

#include

#include

#define sem_key 6666

union semun

;int

main

(int argc ,

char

*ar**)

addr=

shmat

(shmid,0,

0);//獲取共享記憶體的起始位址,且為可讀可寫if(

-1==*addr)

int semid;

int ret;

semid =

semget

(sem_key,

2, ipc_creat |

0600);

//建立2個訊號量if(

-1== semid)

printf

("semid = %d\n"

, semid)

;// 初始化2個訊號量

union semun sem_args;

unsigned

short array[2]

=;sem_args.array = array;

ret =

semctl

(semid,

1, setall, sem_args)

;//setall代表設定訊號集中所有的訊號量的值。1,代表2個,sem_args是具體初始化的值放在共用體中。if(

-1== ret)

//對資源的使用處理操作

struct sembuf sem_opt_wait1[1]

=;struct sembuf sem_opt_wakeup1[1]

=;struct sembuf sem_opt_wait2[1]

=;struct sembuf sem_opt_wakeup2[1]

=;while(1

)return0;

}

源程式2

#include

#include

#include

#include

#include

#include

#include

#define sem_key 6666

union semun

;int

main

(int argc ,

char

*ar**)

addr =

shmat

(shmid,0,

0);//獲取共享記憶體的起始位址,且為可讀可寫if(

-1==*addr)

int semid;

int ret;

semid =

semget

(sem_key,

0, ipc_creat |

0600);

);//取得訊號量if(

-1== semid)

printf

("semid = %d\n"

, semid)

;//對資源的使用處理操作

struct sembuf sem_opt_wait1[1]

=;struct sembuf sem_opt_wakeup1[1]

=;struct sembuf sem_opt_wait2[1]

=;struct sembuf sem_opt_wakeup2[1]

=;while(1

)else

if(ret <20)

else

semop

(semid, sem_opt_wakeup2,1)

;//釋放程序2的資源,即喚醒程序2}if

(-1==

semctl

(semid,

1,ipc_rmid,0)

)//刪除訊號量if(

-1==shmdt

(addr)

)//釋放共享記憶體,使其不再有任何指向它的指標if(

shmctl

(shmid,ipc_rmid,0)

==-1)

//刪除共享記憶體

return0;

}//兩個程序相互制約,而達到資源的有效使用。

systemV訊號量 與 Posix訊號量

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

System V 訊號量使用相關函式

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

linux 之 system v 訊號量

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