日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 嵌入式 > 嵌入式教程
[導讀]基于linux操作系統(tǒng)的進程通信設計

linux下的進程通信手段基本上是從Unix平臺上的進程通信手段繼承而來的。而對Unix發(fā)展做出重大貢獻的兩大主力AT&T的貝爾實驗室及BSD(加州大學伯克利分校的伯克利軟件發(fā)布中心)在進程間通信方面的側重點有所不同。前者對Unix早期的進程間通信手段進行了系統(tǒng)的改進和擴充,形成了“system V IPC”,通信進程局限在單個計算機內;后者則跳過了該限制,形成了基于套接口(socket)的進程間通信機制。Linux則把兩者繼承了下來,如圖示:

其中,最初Unix IPC包括:管道、FIFO、信號;System V IPC包括:System V消息隊列、System V信號燈、System V共享內存區(qū);Posix IPC包括:Posix消息隊列、Posix信號燈、Posix共享內存區(qū)。有兩點需要簡單說明一下:

1)由于Unix版本的多樣性,電子電氣工程協會(IEEE)開發(fā)了一個獨立的Unix標準,這個新的ANSI Unix標準被稱為計算?肪車目梢浦殘圓僮饗低辰緱媯≒SOIX)。現有大部分Unix和流行版本都是遵循POSIX標準的,而Linux從一開始就遵循POSIX標準;

2)BSD并不是沒有涉足單機內的進程間通信(socket本身就可以用于單機內的進程間通信)。事實上,很多Unix版本的單機IPC留有BSD的痕跡,如4.4BSD支持的匿名內存映射、4.3+BSD對可靠信號語義的實現等等。

linux下進程間通信的幾種主要手段簡介:

1.管道

管道是進程間通信中最古老的方式,它包括無名管道和有名管道兩種,前者可用于具有親緣關系進程間的通信,即可用于父進程和子進程間的通信,后者額克服了管道沒有名字的限制,因此,除具有前者所具有的功能外,它還允許無親緣關系進程間的通信,即可用于運行于同一臺機器上的任意兩個進程間的通信。

無名管道由pipe()函數創(chuàng)建:

#include

int pipe(int filedis);

參數filedis返回兩個文件描述符:filedes[0]為讀而打開,filedes為寫而打開。filedes的輸出是filedes[0]的輸入。

在Linux系統(tǒng)下,有名管道可由兩種方式創(chuàng)建:命令行方式mknod系統(tǒng)調用和函數mkfifo。下面的兩種途徑都在當前目錄下生成了一個名為myfifo的有名管道:

方式一:mkfifo("myfifo","rw");

方式二:mknod myfifo p

生成了有名管道后,就可以使用一般的文件I/O函數如open、close、read、write等來對它進行操作。

2.消息隊列

消息隊列是消息的鏈接表,包括Posix消息隊列system V消息隊列。消息隊列用于運行于同一臺機器上的進程間通信,它和管道很相似,有足夠權限的進程可以向隊列中添加消息,被賦予讀權限的進程則可以讀走隊列中的消息。消息隊列克服了信號承載信息量少,管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點。

我們可以用流管道或者套接口的方式來取代它。

3.共享內存

共享內存是運行在同一臺機器上的進程間通信最快的方式,因為數據不需要在不同的進程間復制。通常由一個進程創(chuàng)建一塊共享內存區(qū),其余進程對這塊內存區(qū)進行讀寫。共享內存往往與其它通信機制,如信號量結合使用,來達到進程間的同步及互斥。

首先要用的函數是shmget,它獲得一個共享存儲標識符。

#include

#include

#include

int shmget(key_t key, int size, int flag);

這個函數有點類似大家熟悉的malloc函數,系統(tǒng)按照請求分配size大小的內存用作共享內存。Linux系統(tǒng)內核中每個IPC結構都有的一個非負整數的標識符,這樣對一個消息隊列發(fā)送消息時只要引用標識符就可以了。這個標識符是內核由IPC結構的關鍵字得到的,這個關鍵字,就是上面第一個函數的key。數據類型key_t是在頭文件sys/types.h中定義的,它是一個長整形的數據。在我們后面的章節(jié)中,還會碰到這個關鍵字。

當共享內存創(chuàng)建后,其余進程可以調用shmat()將其連接到自身的地址空間中。

void *shmat(int shmid, void *addr, int flag);

shmid為shmget函數返回的共享存儲標識符,addr和flag參數決定了以什么方式來確定連接的地址,函數的返回值即是該進程數據段所連接的實際地址,進程可以對此進程進行讀寫操作。

使用共享存儲來實現進程間通信的注意點是對數據存取的同步,必須確保當一個進程去讀取數據時,它所想要的數據已經寫好了。通常,信號量被要來實現對共享存儲數據存取的同步,另外,可以通過使用shmctl函數設置共享存儲內存的某些標志位如SHM_LOCK、SHM_UNLOCK等來實現。[!--empirenews.page--]
 

4. 信號量

信號量又稱為信號燈,它是用來協調不同進程間的數據對象的,而最主要的應用是前一節(jié)的共享內存方式的進程間通信。本質上,信號量是一個計數器,它用來記錄對某個資源(如共享內存)的存取狀況。一般說來,為了獲得共享資源,進程需要執(zhí)行下列操作:

(1) 測試控制該資源的信號量。

(2) 若此信號量的值為正,則允許進行使用該資源。進程將進號量減1。

(3) 若此信號量為0,則該資源目前不可用,進程進入睡眠狀態(tài),直至信號量值大于0,進程被喚醒,轉入步驟(1)。

(4) 當進程不再使用一個信號量控制的資源時,信號量值加1。如果此時有進程正在睡眠等待此信號量,則喚醒此進程。

維護信號量狀態(tài)的是Linux內核操作系統(tǒng)而不是用戶進程。我們可以從頭文件/usr/src/linux/include/linux/sem.h中看到內核用來維護信號量狀態(tài)的各個結構的定義。信號量是一個數據集合,用戶可以單獨使用這一集合的每個元素。要調用的第一個函數是semget,用以獲得一個信號量ID。

#include

#include

#include

int semget(key_t key, int nsems, int flag);

key是前面講過的IPC結構的關鍵字,它將來決定是創(chuàng)建新的信號量集合,還是引用一個現有的信號量集合。nsems是該集合中的信號量數。如果是創(chuàng)建新集合(一般在服務器中),則必須指定nsems;如果是引用一個現有的信號量集合(一般在客戶機中)則將nsems指定為0。

semctl函數用來對信號量進行操作。

int semctl(int semid, int semnum, int cmd, union semun arg);

不同的操作是通過cmd參數來實現的,在頭文件sem.h中定義了7種不同的操作,實際編程時可以參照使用。

semop函數自動執(zhí)行信號量集合上的操作數組。

int semop(int semid, struct sembuf semoparray[], size_t nops);

semoparray是一個指針,它指向一個信號量操作數組。nops規(guī)定該數組中操作的數量。

下面,我們看一個具體的例子,它創(chuàng)建一個特定的IPC結構的關鍵字和一個信號量,建立此信號量的索引,修改索引指向的信號量的值,最后我們清除信號量。

5.套接口

套接口(socket)編程是實現Linux系統(tǒng)和其他大多數操作系統(tǒng)中進程間通信的主要方式之一。我們熟知的WWW服務、FTP服務、TELNET服務等都是基于套接口編程來實現的。除了在異地的計算機進程間以外,套接口同樣適用于本地同一臺計算機內部的進程通信。

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯系該專欄作者,如若文章內容侵犯您的權益,請及時聯系本站刪除。
換一批
延伸閱讀

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據LED驅動電源的公式,電感內電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉