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...