Linux Unix程式設計 程序通訊IPC 訊號量

2021-10-12 10:31:22 字數 1710 閱讀 5035

訊號量是為了控制臨界資源而產生的乙個或一組計數器,在本質上是乙個整形變數

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_op

0:z操作,判斷訊號量數值是否等於0

<0:p操作,訊號量數值增加sem_op

struct sembuf sb;

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系統程式設計 程序同步與互斥 訊號量 命名...