Linux程序通訊之二元訊號量

2021-08-02 13:04:04 字數 2572 閱讀 4041

linux中,基於system v的程序間通訊還有二元訊號量的通訊方式,但嚴格意義上來說,訊號量並不具備資料交換的功能,它本質是一把資料操作鎖。通過控制其他的通訊資源(⽂件,外部裝置)來實現程序間通訊,它本⾝只是⼀種外部資源的標識。訊號量在此過程中負責資料操作的互斥、同步等功能。

為了防⽌出現因多個程式同時訪問⼀個共享資源⽽引發的⼀系列問題,我們需要⼀種⽅法,它可以通過⽣成並使⽤令牌來授權,在任⼀時刻只能有⼀個執⾏執行緒訪問**的臨界區域。臨界區域是指執⾏資料更新的**需要獨佔式地執⾏。⽽訊號量就可以提供這樣的⼀種訪問機制,讓⼀個臨界區同⼀時間只有⼀個執行緒在訪問它, 也就是說訊號量是⽤來調協程序對共享資源的訪問的。其中共享記憶體的使⽤就要⽤到訊號量。

訊息佇列就是通過兩個程序訪問一塊核心中的公共資源,而產生的的程序間通訊,但是,若是在訪問這塊公共資源時,二者沒有互斥與同步機制,那麼必然會造成對 公共資源的訪問出現問題。

#include 

#include

#include

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

int nsems代表這個訊號量集裡有幾個訊號量,今天我們的測試**只需乙個,sem***與msgget的含義相同:代表建立方式和許可權。

#include 

#include

#include

int semctl(int semid, int semnum, int cmd, ...);

semnum表示需要進行控制的第幾號訊號量,我們只有乙個所以當然是他的下標0。cmd表示需要進行控制的方式。

semctl() 在 semid 標識的訊號量集上,或者該集合的第 semnum 個訊號量上執⾏ cmd 指定的控制命令。(訊號量集合索引起始於零。)根據 cmd 不同,這個函式有三個或四個引數。當有四個引數時,第四個引數的型別是 union

。調⽤程式必須按照下⾯⽅式定義這個聯合體:

union semun ;
#include 

#include

#include

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

int semtimedop(int semid, struct sembuf *sops, unsigned nsops,struct timespec *timeout);

struct sembuf;

注意:該聯合體沒有定義在任何系統頭⽂件中,因此得⽤戶⾃⼰宣告。

//標頭檔案:comm.h

可見,沒有經過訊號量保護的程式輸出的ab不一定是成對的,但是我們的預期就是成對出現,所以與我們的預期結果完全不符。

那麼經過訊號量保護的程式則是aabb完全成對輸出。保證了對乙個鄰界資源訪問期間的完全占有。

若有錯誤,請指出!謝謝!

Linux程序通訊 訊號量

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

Linux程序通訊 訊號量

訊號量是乙個核心變數,它可以被系統中的任何程序所訪問。程序間可以使用這個變數來協調對於共享記憶體和其他資源的訪問。如果不刪除訊號量,它將繼續在系統中存在,即使程式已經退出,它可能在你下次執行此程式時引發問題,而且訊號量是一種有限的資源。簡單的例子 父程序與子程序共享印表機,必須其中一者列印完後,另一...

Linux 程序通訊 訊號量

基本概念 訊號量和p,v 原語 訊號量 訊號量值的含義 訊號量結構偽 訊號量的本質是乙個計數器 struct semaphore p原語 p s v原語 v s 訊號量有關函式 建立或開啟訊號量 設定初值 銷毀訊號量 union semun union senun su su.val 1 檢視訊號量...