訊號量是解決因多個程式同時訪問乙個共享資源而引發的一系列問題的,訊號量是0代表其他程式要暫時掛起,不能訪問訊號量控制的**區,訊號量為1,代表其他程式可以訪問訊號量控制的**區,這個訊號量也是在核心區的共享記憶體存放的,我們來看幾個關鍵函式:
1 semget函式
它的作用是建立乙個新訊號量或取得乙個已有訊號量,原型為:
int semget(key_t key, int num_sems, int sem_flags);
第乙個引數key是整數值(唯一非零),不相關的程序可以通過它訪問乙個訊號量,它代表程式可能要使用的某個資源,程式對所有訊號量的訪問都是間接的,程式先通過呼叫semget函式並提供乙個鍵,再由系統生成乙個相應的訊號識別符號(semget函式的返回值),只有semget函式才直接使用訊號量鍵,所有其他的訊號量函式使用由semget函式返回的訊號量識別符號。如果多個程式使用相同的key值,key將負責協調工作。
第二個引數num_sems指定需要的訊號量數目,它的值幾乎總是1。
第三個引數sem_flags是一組標誌,當想要當訊號量不存在時建立乙個新的訊號量,可以和值ipc_creat做按位或操作。設定了ipc_creat標誌後,即使給出的鍵是乙個已有訊號量的鍵,也不會產生錯誤。而ipc_creat | ipc_excl則可以建立乙個新的,唯一的訊號量,如果訊號量已存在,返回乙個錯誤。
semget函式成功返回乙個相應訊號識別符號(非零),失敗返回-1
2 semctl函式
該函式用來直接控制訊號量資訊,它的原型為:
int semctl(int sem_id, int sem_num, int command, …);
我們一般用前面3個引數即可
前兩個引數與前面乙個函式中的一樣,command通常是下面兩個值中的其中乙個
setval:用來把訊號量初始化為乙個已知的值,值為第二個引數
ipc_rmid:用於刪除乙個已經無需繼續使用的訊號量識別符號。
3 semop函式
它的作用是改變訊號量的值,原型為:
int semop(int sem_id, struct sembuf *sem_opa, size_t num_sem_ops);
sem_id是由semget返回的訊號量識別符號,sembuf結構的定義如下:
struct sembuf;
下面來看乙個例子:
down函式和up函式中間區域就是訊號量控制的區域,乙個程序在訪問的時候,另外乙個程序掛起等待
我們本來設想的是乙個程序列印hello world,然後sleep10秒,另外乙個程序才可以執行,並列印hello world,但是這樣寫報錯了:
具體原因我沒找到,真正想達到的效果如下:
這個時候我開另外乙個遠端終端,再來執行這個函式
另外這個程序就必須等之前那個程序執行完畢才會執行,如果有哪位朋友知道這是什麼情況,請告知我,感激不盡。
好了,linux 程序間通訊之訊號量就總結到這裡,如有問題,歡迎指正,謝謝。
Linux程序間通訊之訊號量
眾所周知,每個程序使用的資料是是它獨有的,即使之前沒有,它也會在自己的記憶體區域拷貝乙個 這裡不考慮共享記憶體機制 如果程序間需要通訊,有共享資源時,訊號,管道,訊息佇列,訊號量,共享記憶體,這幾種技術都可以幫我們。這裡先介紹訊號量 訊號量定義 為了防止出現因多個程式同時訪問乙個共享資源而引發的一些...
Linux程序間通訊之訊號量
linux程序間通訊之訊號量 訊號量是一種用於提供不同程序間或乙個給定程序的不同執行緒間同步手段的原語。在unix下有三種分別如下 在這裡只和大家分享下有關system v訊號量。system v通過定義計數訊號量集來對訊號量的操作,計數訊號量集是乙個或多個訊號量構成乙個集合,其中每個都是計數訊號量...
程序間通訊之訊號量
訊號量的本質是一種資料操作鎖,其本身不具有資料交換的能力,而是通過控制其他的通訊資源 檔案 外部裝置 來實現程序間通訊,它本身只是一種外部資源的標識。訊號量在此過程中負責資料的互斥 同步等功能。當請求乙個訊號量來表示資源時,程序需要讀取訊號量的值來判斷資源是否可用。大於0,資源可以請求,等於0,無資...