訊號量是為了控制臨界資源而產生的乙個或一組計數器,在本質上是乙個整形變數
p操作:程序申請臨界資源是發出p操作
流程:檢查訊號量取值,如大於0,分配臨界資源,訊號量減1,否則代表當前無空餘資源,程序阻塞直到指定資源到達為止。
v操作:程序釋放臨界資源時發生v操作
流程:釋放臨界資源,訊號量的取值加1
z操作:又稱為測試操作
流程:等待當前訊號量取值為0,如成立,程序返回,否則程序阻塞直到條件成立為止 注:
同步:體現程序間的協同關係,乙個程序生產資料,其它程序使用這個資料。
互斥:體現了程序之間的競爭關係,當臨界資源不足時,程序排隊使用這個資料,佇列首程序獲取到資源後,其它程序進入等待,直到該資源被釋放為止
訊號量集合由乙個或多個訊號量組合而成,ipc物件中的訊號量通常指的是訊號量集合。unix的核心採用結構semid_ds來管理訊號量
訊號量的建立 semget()
#include
#include
#include
int semget(key_t key, int nsems, int sem***);
ipc_creat:建立訊號量,如已存在,開啟該訊號量;
ipc_excl:單獨使用無意義,與ipc_creat共同使用,建立訊號量,如已存在,呼叫失敗。
nsems : 集合中有幾個訊號量
訊號量的控制 semctl()
#include
#include
#include
int semctl(int semid, int semnum, int cmd, union semun arg);
控制聯合體
union semun
;ipc_stat模板
例1 獲取標識號為semid的訊號量集合的狀態。
union semun semopts;
struct emid_ds semidbuf;
semopts.buf = &semidbuf;
semctl(semid, 0, ipc_stat, semopts);
ipc_rmid模板
刪除標識號為semid的訊號量。
semctl(semid, 0, ipc_rmid);
setval模板
設定標識號為semid、序號為index的訊號量取值為10。
union semun semopts;
semopts.val = 10;
semctl(semid, index, setval, semopts);
訊號量操作 semop()
#include
#include
#include
int semop(int semid, struct sembuf *sops, unsigned nsops);
semop引數取值:
0:v操作,訊號量數值增加sem_opstruct sembuf sb;0:z操作,判斷訊號量數值是否等於0
<0:p操作,訊號量數值增加sem_op
sb.sem_num = 3;
sb.sem_op = -1;
sb.sem_*** = sb.sem_*** & ~ipc_nowait; //阻塞操作
semop(semid, &sb, 1);
編寫Linux Unix守護程序
守護程序在linux unix系統中有著廣泛的應用。有時,開發人員也想把自己的程式變成守護程序。在建立乙個守護程序的時候,要接觸到子程序 程序組 會晤期 訊號機制 檔案 目錄和控制終端等多個概念。因此守護程序還是比較複雜的,在這裡詳細地討論linux unix的守護程序的編寫,總結出八條經驗,並給出...
Linux UNIX網路程式設計
本書詳細介紹了在unix linux系統下基於tcp ip網路套介面的基本程式設計方法,包括迭代與併發伺服器編寫方法 程序與執行緒程式設計技術 i o程式設計技術 ipv4與ipv6的相容性 原始套介面 資料鏈路訪問技術 廣播與多播技術等。為滿足教學實際需要,在本書最後一章給出了socket基本程式...
Linux程序通訊程式設計
linux系統程式設計 程序同步與互斥 有名訊號量 linux系統程式設計 程序間通訊 共享記憶體 linux系統程式設計 程序間通訊 訊號中斷處理 linux系統程式設計 程序間通訊 管道 pipe linux系統程式設計 程序間通訊 訊息佇列 linux系統程式設計 程序同步與互斥 訊號量 命名...