Linux程序間通訊 訊號量

2021-10-24 02:16:19 字數 2432 閱讀 4952

1. 訊號量概述

在多工作業系統環境下,多個程序會同時執行,並且一下程序間可能存在一定的關聯。多個程序可能為了完成同乙個任務相互協作,這就形成了程序間的同步關係。而且在不同程序間,為了爭奪有限的系統資源會進入競爭狀態,這就是程序間的互斥關係。

同步和互斥關係存在的根源在於臨界資源。臨界資源是在同乙個時刻只允許有限個程序可以訪問或修改資源。訪問臨界資源的**就做臨界區,臨界區本身也會成為臨界資源。

訊號量是用來解決程序間的同步與互斥問題的一種程序間通訊機制,包括乙個稱為訊號量的變數和在該訊號量下等待資源的程序等待佇列,以及對訊號量進行的兩個原子操作(pv操作)。其中訊號量對應於某一種資源,取乙個非負的整型值。訊號量值指的是當前可用的該資源的數量,若等於0則意味著目前沒有可用的資源。

pv原子操作的具體定義如下:

最簡單的訊號量只有0和1兩種值,這種訊號量被稱為二值訊號量。

2. 訊號量程式設計

2.1 程式設計說明

在linux系統中,使用訊號量通常分為以下幾個步驟:

2.2 函式介紹

semget() 函式

/*****semget()函式*****/

函式原型:int

semget

(key_t key,

int nsems,

int sem***)

傳 入 值:key 訊號量的鍵值,多個程序可以通過它訪問同乙個訊號量。ipc_private用於建立私有訊號量

nsems 需要建立的訊號量數目,通常為1

sem*** 同 open

() 函式的許可權位

返 回 值:成功:返回訊號量識別符號,在訊號量的其他函式中都會使用該值;

失敗:返回-

1

semctl() 函式

/*****semctl()函式*****/

函式原型:int

semctl

(int semid,

int semnum,

int cmd,

union semun arg)

傳 入 值:semid semget

()函式返回的訊號量識別符號

semnum 訊號量編號,使用訊號量集時會用到。通常取為0,即使用單個訊號量

cmd 指定對訊號量的各種操作,當使用單個訊號量時,常見的操作見下表

arg 是union semun結構

返 回 值:成功:根據cmd值的不同返回不同的值;

失敗:返回-

1//union semun結構的定義

union semun

cmd值

對應的操作含義

ipc_stat

獲得該訊號量的semid_ds結構,並放在第四個引數arg結構中

ipc_setval

將訊號量值設定為arg的val值

ipc_getval

返回訊號量的當前值

ipc_rmid

從系統中刪除訊號量

semop() 函式

/*****semop()函式*****/

函式原型:int

semop

(int semid,

struct sembuf *sops, size_t nsops)

傳 入 值:semid semget

()函式返回的訊號量識別符號

sops 指向訊號量運算元組

nsops 運算元組sops中的操作個數,通常取1

返 回 值:成功:返回訊號量識別符號,在訊號量的其他函式中都會使用該值;

失敗:返回-

1//sembuf結構體的定義

struct sembuf

2.3 函式例項

因為訊號量相關的函式呼叫比較複雜,可以將他們封裝成單個訊號量的幾個基本函式。

/*****sem_com.c*****/

#include

"sem_com.h"

/*訊號量初始化函式*/

intinit_sem

(int sem_id,

int init_value)

return0;

}/*刪除訊號量函式*/

intdel_sem

(int sem_id)

}/*p操作函式*/

intsem_p

(int sem_id)

return0;

}/*v操作函式*/

intsem_v

(int sem_id)

return0;

}

以下例項說蒙了訊號量的概念及基本用法

/*****fork.c*****/

//標頭檔案省略

intmain()

else

exit(0

);}

linux 訊號量(程序間通訊)

將使用乙個程式來演示訊號量的使用,程式用pv操作控制訊號量,以操作臨界區,p操作讓訊號量減1,v操作讓訊號量加1,而pv操作之間的 即為臨界區關鍵 每次只能由乙個程序訪問。程式建立出乙個子程序,在兩個程序中分別有一段臨界區關鍵 實現的功能都是不斷的順序輸出0 9的字元。保證程序間同步 plain v...

linux 程序間通訊 訊號量

例項中首先使用fork 建立乙個子程序,在父程序呼叫kill 之前,在子程序中使用raise 向自身傳送sigstop訊號,是子程序暫停。接下來使用kill 向子程序傳送訊號 ngnsvr9 none home xionghailong example cat kill raise.c includ...

Linux 程序間通訊 訊號量

linux學習目錄 1 什麼是訊號量?在對於臨界區資源管理過程中,為了防止多個程式同時訪問乙個共享資源而引發的一系列問題。比如 死鎖。為了解決這種問題,巨人們就發明了訊號量。訊號量就是為了解決在乙個臨界區只有乙個程序訪問它,也就是說訊號量相當於交警,來協調程序對共享資源有序的訪問而不造成死鎖等行為。...