1. 程式人生 > >semop函式詳解 linux/unix

semop函式詳解 linux/unix

【semop系統呼叫】 
  
功能描述:
操作一個或一組訊號。

 
用法:
#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,則操作將暫時阻塞,直到訊號的值變為0。
sem_flg:訊號操作標誌,可能的選擇有兩種
IPC_NOWAIT //對訊號的操作不能滿足時,semop()不會阻塞,並立即返回,同時設定錯誤資訊。
IPC_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:訊號所允許的值越界