linux的訊號量通訊

2021-06-22 09:31:22 字數 1508 閱讀 4009

檢視共享資訊的記憶體的命令是ipcs [-m|-s|-q] (全部的話是ipcs -a) ;檢視共享資訊的記憶體的命令是ipcs [-m|-s|-q]

訊號量是乙個特殊的變數,程式對其訪問都是原子操作,且只允許對它進行等待(即p(訊號變數))和傳送(即v(訊號變數))資訊操作。最簡單的訊號量是只能取0和1的變數,這也是訊號量最常見的一種形式,叫做二進位制訊號量。而可以取多個正整數的訊號量被稱為通用訊號量。這裡主要討論二進位制訊號量.

p操作: 

負責把當前程序由執行狀態轉換為阻塞狀態,直到另外乙個程序喚醒它。

操作為:申請乙個空閒資源(把訊號量減1),若成功,則退出;若失敗,則該程序被阻塞;

v操作:

負責把乙個被阻塞的程序喚醒,它有乙個參數列,存放著等待被喚醒的程序資訊。

操作為: 釋放乙個被占用的資源(把訊號量加1),如果發現有被阻塞的程序,則選擇乙個喚醒之。

1.semget()

int semget(key_t key, int nsems, int sem***);

乙個引數 

key是整數值(唯一非零),不相關的程序可以通過它訪問乙個訊號量,它代表程式可能要使用的某個資源,程式對所有訊號量的訪問都是

間接的,程式先通過呼叫semget函式並提供乙個鍵,再由系統生成乙個相應的訊號識別符號(semget函式的返回值),只有semget函式才直接使用訊號量鍵,所有其他的訊號量函式使用由semget函式返回的訊號量識別符號。如果多個程式使用相同的key值,key將負責協調工作。

第二個引數num_sems指定需要的訊號量數目,它的值幾乎總是1。

第三個引數sem_flags是一組標誌,當想要當訊號量不存在時建立乙個新的訊號量,可以和值ipc_creat做按位或操作。設定了ipc_creat標誌後,即使給出的鍵是乙個已有訊號量的鍵,也不會產生錯誤。而ipc_creat | ipc_excl則可以建立乙個新的,唯一的訊號量,如果訊號量已存在,返回乙個錯誤。

semget函式成功返回乙個相應訊號識別符號(非零),失敗返回-1

2,semop()

它的作用是改變訊號量的值

int semop (int semid, struct sembuf *sops, unsigned nsops);
struct sembuf;
3,semctl()

int semctl(int semid, int semnum, int cmd, ...);
union semun;
前兩個引數與前面乙個函式中的一樣,command通常是下面兩個值中的其中乙個

setval:用來把訊號量初始化為乙個已知的值。p 這個值通過union semun中的val成員設定,其作用是在訊號量第一次使用前對它進行設定。

ipc_rmid:用於刪除乙個已經無需繼續使用的訊號量識別符號。

參考來自:blog.csdn.net/ljianhui/article/details/10243617

linux通訊 訊號量

程式主要參考 include include include include include include include union semun 必須自己定義 void p int k void v int k int main void char buf father int i 0,semi...

訊號量通訊

linux程序間通訊 使用訊號 下面就進入訊號量的講解。一 什麼是訊號量 為了防止出現因多個程式同時訪問乙個共享資源而引發的一系列問題,我們需要一種方法,它可以通過生成並使用令牌來授權,在任一時刻只能有乙個執行執行緒訪問 的臨界區域。臨界區域是指執行資料更新的 需要獨佔式地執行。而訊號量就可以提供這...

Linux程序通訊 訊號量

主要用於程序對共享資源的互斥訪問。為了取得對乙個共享資源,程序測試訊號量的值,如果為正,表示還有資源可以訪問,該程序對訊號量加減一。如果為0表示沒有資源可以用,該程序應當休眠等待訊號量的值再次為正。linux中的訊號量使用起來是比較麻煩的。在這裡,訊號量是以集合形式存在的,建立時要給出訊號量的數目,...