功能描述:
操作乙個或一組訊號。
用法:
#include
#include
#include
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
; 這三個欄位的意義分別為:
sem_num:操作訊號在訊號集中的編號,第乙個訊號的編號是0。
sem_op:如果其值為正數,該值會加到現有的訊號內含值中。通常用於釋放所控資源的使用權;如果sem_op的值為負數,而其絕對值又大於訊號的現值,操作將會阻塞,直到訊號值大於或等於sem_op的絕對值。通常用於獲取資源的使用權;如果sem_op的值為0,則操作將暫時阻塞,直到訊號的值變為0。
sem_***:訊號操作標誌,可能的選擇有兩種
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:訊號所允許的值越界
linux 系統呼叫
使用者應用可以通過兩種方式使用系統呼叫。第一種方式是通過c庫函式,包括系統呼叫在c庫中的封裝函式和其他普通函式。圖5.2 使用系統呼叫的兩種方式 第二種方式是使用 syscall巨集。2.6.18版本之前的核心,在include asm i386 unistd.h檔案中定義有7個 syscall巨集...
Linux系統呼叫
一 實驗目的和要求 1.學習linux核心的配置和編譯 2.深入理解linux系統呼叫 3.理解arm和x86的cpu模式 系統模式 使用者模式 的不同 4.掌握核心模組的編寫方法。二 實驗器材 1.linux實驗板卡一塊 2.5v 1a電源乙個 3.microusb線一根 4.macos一台 5....
Linux系統呼叫
linux系統呼叫 系統呼叫 system call 是使用者空間訪問核心的唯一手段,除異常和陷入外,他們是核心唯一的合法入口。通常情況下應用程式是通過應用程式設計介面api來訪問函式,而不是直接使用系統呼叫來程式設計。作業系統通常是通過中斷從使用者態切換到核心態。中斷就是乙個硬體或軟體請求,要求c...