信號量的值與相應資源的使用情況有關,當它的值大於 0 時,表示當前可用的資源數的數量;當它的值小於 0 時,其絕對值表示等待使用該資源的進程個數。信號量的值僅能由 PV 操作來改變。
基本介紹
- 外文名:int semop(int semid,struct sembuf *sops,size_t nsops)
- 平台: Linux
- 簡寫:semop
- 功能描述:操作一個或一組信號
定義,詳解,功能描述,用法,參數,返回說明,
定義
在 Linux 下,PV 操作通過調用semop函式來實現。該函式定義在頭檔案 sys/sem.h中,原型如下:
int semop(int semid,struct sembuf *sops,size_t nsops);
詳解
功能描述
操作一個或一組信號。
用法
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semop(int semid, struct sembuf *sops, unsigned nsops);
int semtimedop(int semid, struct sembuf *sops, unsigned nsops, struct timespec *timeout);
參數
semid:信號集的識別碼,可通過semget獲取。
sops:指向存儲信號操作結構的數組指針,信號操作結構的原型如下
struct sembuf
{
unsigned short sem_num; /* semaphore number */
short sem_op; /* semaphore operation */
short sem_flg; /* operation flags */
};
這三個欄位的意義分別為:
sem_num:操作信號在信號集中的編號,第一個信號的編號是0。
sem_op:如果其值為正數,該值會加到現有的信號內含值中。通常用於釋放所控資源的使用權;如果sem_op的值為負數,而其絕對值又大於信號的現值,操作將會阻塞,直到信號值大於或等於sem_op的絕對值。通常用於獲取資源的使用權;如果sem_op的值為0,如果沒有設定IPC_NOWAIT,則調用該操作的進程或者執行緒將暫時睡眠,直到信號量的值為0;否則,進程或者執行緒不會睡眠,函式返回錯誤EAGAIN。
sem_flg:信號操作標誌,可能的選擇有兩種
IPC_NOWAIT //對信號的操作不能滿足時,semop()不會阻塞,並立即返回,同時設定錯誤信息。
SEM_UNDO //程式結束時(不論正常或不正常),保證信號值會被重設為semop()調用前的值。這樣做的目的在於避免程式在異常情況下結束時未將鎖定的資源解鎖,造成該資源永遠鎖定。
nsops:信號操作結構的數量,恆大於或等於1。
timeout:當semtimedop()調用致使進程進入睡眠時,睡眠時間不能超過本參數指定的值。如果睡眠逾時,semtimedop()將失敗返回,並設定錯誤值為EAGAIN。如果本參數的值為NULL,semtimedop()將永遠睡眠等待。