Posix訊號量操作函式

2022-06-29 01:39:07 字數 1650 閱讀 9944

posix有名訊號量:使用posix ipc名字標識,可用於執行緒或程序間同步

posix基於記憶體的訊號量:存放在共享記憶體區中,可用於程序或執行緒間的同步

#include //

建立乙個新的有名訊號量或開啟乙個已存在的有名訊號量

//成功返回指向訊號量的指標,出錯返回sem_failed

sem_t *sem_open(const

char *name, int oflag, /*

mode_t mode, unsigned int value

*/);

//name:ipc 名字,可能是某個檔案系統中的乙個真正路徑名,也可能不是

//oflag: 可以是0、o_creat、o_creat|o_excl

//在oflag指定了o_creat標誌後,mode、value引數必須指定(mode指定許可權位,value指定訊號量初值)

//關閉乙個由 sem_open 開啟的訊號量

//成功返回0,出錯返回-1

int sem_close(sem_t *sem);

//將某個有名訊號量從系統刪除

//成功返回0,出錯返回-1

int sem_unlink(const

char *name);

#include //

測試指定訊號量的值,若該值大於0,則將其減1並立即返回,若該值為0,則

//執行緒被投入睡眠,等待該值變為大於0,再將其減1並返回

//成功返回0,出錯返回-1

int sem_wait(sem_t *sem);

////

測試指定訊號量的值,若該值大於0,則將其減1並立即返回,若該值為0,則

//返回乙個eagain錯誤

//成功返回0,出錯返回-1

int sem_trywait(sem_t *sem);

#include //

//然後喚醒等待該訊號量值變為正數的任意執行緒

//成功返回0,出錯返回-1

int sem_post(sem_t *sem);

#include //

通過valp返回指定訊號量的當前值,若當前訊號量已上鎖,則返回0或某個

//負數(其絕對值為等待該訊號量解鎖的執行緒數)

//成功返回0,出錯返回-1

int sem_getvalue(sem_t *sem, int *valp);

#include //

初始化乙個基於記憶體的訊號量(sem指向的)

int sem_init(sem_t *sem, int shared, unsigned int

value);

//sem引數指向應用程式分配的sem_t變數

//shared引數為0時,待初始化的訊號量是在同一程序的各個執行緒中共享的(具有隨程序的持續性)

//shared引數非0時,待初始化的訊號量必須放在某種型別的共享記憶體區中,想

//要是由此訊號量的所有程序都需要可以訪問該共享記憶體區(隨該共享記憶體區持續)

//value引數為該訊號量的初始值

//摧毀指定的基於記憶體的訊號量

//成功返回0,出錯返回-1

int sem_destroy(sem_t *sem);

systemV訊號量 與 Posix訊號量

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

posix訊號量機制

posix為可移植的作業系統介面標準,定義了作業系統應該為應用程式提供的介面標準 訊號量機制是我們在作業系統中學到的知識,可以用來解決同步和互斥的問題,它只能被兩個標準的原語wait s 和signal s 來訪問,也就是p操作和v操作。訊號量的概念在system v 和posix 中都有,但是它們...

Linux併發(POSIX訊號量)

system v的訊號量是老古董,除非萬不得已,否則我們一般用posix訊號量,好用 簡單 靠譜。拓展 posix訊號量分為兩種,分別是posix無名訊號量和posix有名訊號量,這兩種訊號量比之前介紹的system v的訊號量機制要簡潔,雖然沒有後者的應用範圍那麼廣泛 尤其在一些老系統中,因為sy...