程序間的通訊 訊號量

2021-08-09 16:41:13 字數 2307 閱讀 1622

什麼是訊號量:

訊號量就是乙個計數器,用於表示乙個共享資源可以同時被多少個程序同時訪問的變數。

模擬於生活中的例子就是:同一計程車可以為所有人服務。計程車就是資源,需要計程車的一夥人就是程序,這夥人我們稱之為團體。計程車所能載的團體個數就是訊號量。一般情況,計程車只能為乙個團體服務。你不可能讓乙個已經載客的計程車拋棄車上的乘客,然後為你服務。那麼我們就可以說計程車這個共享資源的訊號量為1。系統為訊號量定義了兩個結構體:

struct semid_ds  ;

每個訊號量由乙個無名結構表示,它至少包含下列成員: (這個是什麼意思??)

struct ;

訊號量工作方式

訊號量為1,表示計程車可以為乙個團體服務。也就是你所看到的「空車」狀態。

訊號量為0,表示計程車不能為其他團體服務。也就是你所看到的「有客」狀態。

訊號量操作

linux系統為使用者提供了一組精心設計的訊號量介面來對訊號進行操作,它們不只是針對二進位制訊號量,下面將會對這些函式進行介紹,但請注意,這些函式都是用來對成組的訊號量值進行操作的。它們宣告在標頭檔案sys/sem.h中。

1、semget函式

#includeint semget(key_t key, int nsems, int flags);
函式功能:獲取/建立乙個訊號量集。當採用獲取操作時,nsems置0;採取建立操作時,nsems必須指定值。
返回值:獲取/建立成功,返回訊號量集的id,失敗則返回-1。
注意:不能用id<0斷言
第乙個引數的型別是key_t,這是鍵。是基本系統資料型別,在標頭檔案中定義為長整型。其實就是可以當做整形直接來使用。建立乙個訊號量集必須制定乙個鍵,然後鍵在系統中無法被識別,核心將鍵轉變為識別符號。識別符號在系統中唯一。生活中整形好用,識別符號用起來不方便。於是系統做了對映的簡化。

第二個引數是整形,nsems表示的是建立訊號量集時有多少個訊號量。也就是說假如訊號量集是乙個陣列,那麼該引數表示陣列的長度。意義是資源被獲取需要多少個訊號量。這個和訊號量的值無關。訊號量的值表示資源可以同時被多少個程序訪問。基本上置為1。獲取則置為0;

第三個引數是訊號量集的許可權,如下圖給出了ipc的許可權。

許可權值與檔案操作的許可權值相同。

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

2、semctl

#includeint sem(int semid, int semnum, int cmd,.../*union semun arg*/);
函式功能:在第一次使用定義的訊號量集前對其訊號量的值進行初始化。也可以刪除乙個已經存在的訊號量集。
返回值:
第乙個引數就是訊號量集的id,也就是semget()的返回值。

第二個引數就是處理該id的訊號量集中訊號量的個數。

第三個引數通常是下面兩個值中的其中乙個

setval:用來將使用者定義的訊號量集中semnum個訊號初始化。初始化的值是第四個引數union semun arg這個聯合體中的val元素的值。

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

第四個引數是乙個聯合體,而非聯合體指標,該引數是可選引數。當初始化時需要第四個引數,刪除乙個訊號量就不必傳遞第四個引數定義如下:

union semun
3、semop

#includeint semop(int semid, struct sembuf semoparray, size_t nops)
函式功能:對乙個或者多個訊號量值進行操作,改變訊號量的值。用於p/v操作。
返回值:操作成功返回為0,失敗返回-1
第乙個引數是訊號量集的id,也就是semget()的返回值。

第二個引數是乙個結構體指標。指向乙個訊號量運算元組,訊號量操作由sembuf結構表示;

struct sembuf;
第三個是引數是nops,確定了需要對第二個陣列操作的元素的個數。

程序間通訊 訊號量

ipc識別符號和關鍵字 在終端輸入ipcs,可以看到目前系統中所有的ipc資訊 第一列的key就是ipc的關鍵字,第二列是ipc的識別符號。ftok 函式用於獲得乙個ipc的關鍵字,其函式原型是 key t ftok const char pathname,int proj id 下面是乙個訊號量的...

程序間通訊 訊號量

system ipc中,對於每乙個新建的訊號量 訊息佇列 共享記憶體,都有乙個在整個系統中唯一的識別符號。每個標識也都有唯一對應的關鍵字,關鍵字的資料型別為ket t 在終端輸入命令 ipcs 可以看到目前系統中所有的ipc資訊 共享記憶體段 鍵 shmid 擁有者 許可權 位元組 nattch 狀...

程序間通訊 訊號量

訊號量不是ipc 機構,它只是乙個計數器用於不同程序之間或同一程序不同執行緒之間的同步,型別 二元訊號 值為0或 1,1說明有可用資源,0說明此時資源占用,其他程序需等待。計數訊號量 表示可用資源數量。計數訊號量集 由乙個或多個訊號量組成的集合,每乙個都是計數訊號量。訊號量資料結構 include ...