semop

信號量的值與相應資源的使用情況有關,當它的值大於 0 時,表示當前可用的資源數的數量;當它的值小於 0 時,其絕對值表示等待使用該資源的進程個數。信號量的值僅能由 PV 操作來改變。

定義

在 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()將永遠睡眠等待。

返回說明

成功執行時,兩個系統調用都返回0。失敗返回-1,errno被設為以下的某個值

E2BIG:一次對信號的運算元超出系統的限制

EACCES:調用進程沒有權能執行請求的操作,並且不具有CAP_IPC_OWNER權能

EAGAIN:信號操作暫時不能滿足,需要重試

EFAULT:sops或timeout指針指向的空間不可訪問

EFBIG:sem_num指定的值無效

EIDRM:信號集已被移除

EINTR:系統調用阻塞時,被信號中斷

EINVAL:參數無效

ENOMEM:記憶體不足

ERANGE:信號所允許的值越界

相關詞條

熱門詞條

聯絡我們