linux程序間的通訊5(訊號量)

2021-09-26 02:46:45 字數 1990 閱讀 1948

一、訊號量概述

在多工作業系統環境下,多個程序/執行緒會同時進行。多工可能為了完成同乙個目標會相互協作,這樣就形成了任務之間的同步關係。同樣,不同任務之間為了爭奪有限的系統資源(硬體或軟體資源)會進入競爭狀態。 任務間的互斥與同步關係存在的根源在於臨界資源。臨界資源:是指在同一時刻只允許有限個(通常只有乙個)操作的資源。訪問臨界資源的**成為臨界區。 訊號量是用來解決程序/執行緒之間同步與互斥問題的一種通訊機制,包括乙個稱為訊號量的變數和在該訊號量下等待資源程序等待佇列,以及對訊號量進行的兩個原子操作(pv操作)。訊號量常常被用做乙個鎖機制,在某個程序正對特定資源進行操作時,訊號量可以防止其他程序去訪問它

pv原子操作(訊號量工作原理)

p(操作):如果有可用資源(訊號量值大於0),則占用乙個資源(訊號量值減1,進入臨界區**);如果沒有可用資源(訊號量值等於0),則被阻塞,直到系統將資源分配給該任務(進入等待佇列,一直等待到有資源是被喚醒)。

v(操作):如果在該訊號量的等待佇列中有任務在等待資源,則喚醒乙個阻塞任務。如果沒有等待它,則釋放乙個資源(訊號量值加1)。

二、相關函式

1、semget()函式

它的作用是建立乙個新訊號量或取得乙個已有訊號量,原型為:

int semget(key_t key, int num_sems, int sem_flags);

第乙個引數key是整數值(唯一非零),不相關的程序可以通過它訪問乙個訊號量,它代表程式可能要使用的某個資源,程式對所有訊號量的訪問都是間接的,程式先通過呼叫semget()函式並提供乙個鍵,再由系統生成乙個相應的訊號識別符號(semget()函式的返回值),只有semget()函式才直接使用訊號量鍵,所有其他的訊號量函式使用由semget()函式返回的訊號量識別符號。如果多個程式使用相同的key值,key將負責協調工作。

第二個引數num_sems指定需要的訊號量數目,它的值幾乎總是1。

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

semget()函式成功返回乙個相應訊號識別符號(非零),失敗返回-1.

2、semop()函式

它的作用是改變訊號量的值,原型為:

int semop(int sem_id, struct sembuf *sem_opa, size_t num_sem_ops);
sem_id是由semget()返回的訊號量識別符號,sembuf結構的定義如下:

struct sembuf;

3、semctl()函式

該函式用來直接控制訊號量資訊,它的原型為:

int semctl(int sem_id, int sem_num, int command, ...);
如果有第四個引數,它通常是乙個union semum結構,定義如下:

union semun ;

前兩個引數與前面乙個函式中的一樣,command通常是下面兩個值中的其中乙個

setval:用來把訊號量初始化為乙個已知的值。p 這個值通過union semun中的val成員設定,其作用是在訊號量第一次使用前對它進行設定。

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

三、**實現

使用訊號量使子程序比父程序先執行

#include #include #include #include union semun ;

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

void getkey(int num)

void putkey(int num)

int main() else if (pid == 0) else

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