作業系統中常用訊號量相關係統呼叫函式用法
1、sem_open:用於建立或開啟一個命名的訊號量。
點選檢視程式碼
#include <semaphore.h>
sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value);
name:訊號量的名稱,必須以斜槓開頭,例如/my_semaphore。
oflag:開啟標誌,可以為O_CREAT(建立訊號量)和O_EXCL(只在訊號量不存在時建立)的組合,或者為0(開啟現有訊號量)。
mode:訊號量的訪問許可權,通常使用S_IRUSR | S_IWUSR表示使用者可讀寫,並且可以透過’或|‘進行組合可選項如下:
S_IRUSR:使用者(擁有者)具有讀許可權。
S_IWUSR:使用者(擁有者)具有寫許可權。
S_IRGRP:組成員具有讀許可權。
S_IWGRP:組成員具有寫許可權。
S_IROTH:其他使用者具有讀許可權。
S_IWOTH:其他使用者具有寫許可權。
value:訊號量的初始值(計數器的初始值)。
sem_open函式返回一個指向訊號量的指標,可以在後續的訊號量操作中使用該指標。
2、sem_close:關閉一個已經開啟的訊號量。
點選檢視程式碼
#include <semaphore.h>
int sem_close(sem_t *sem);
sem:指向要關閉的訊號量的指標。
3、sem_wait:等待訊號量,並對其進行P(原子減一)操作。
點選檢視程式碼
#include <semaphore.h>
int sem_wait(sem_t *sem);
sem:指向要等待的訊號量的指標。
返回值為0表示成功
4、sem_post:對訊號量進行V(原子加一)操作。
點選檢視程式碼
#include <semaphore.h>
int sem_post(sem_t *sem);
sem:指向要釋出的訊號量的指標。
sem_post函式會將訊號量的值加一。如果有其他程序正在等待該訊號量,則其中一個程序將被喚醒。
5、sem_unlink:用於刪除(取消關聯)一個命名訊號量。
點選檢視程式碼
#include <fcntl.h>
int sem_unlink(const char *name);
返回值為0表示刪除成功
特別注意:在使用以上系統呼叫時,編譯時需要加上-pthread,以確保正確連結執行緒和實時庫