博客專欄

EEPW首頁 > 博客 > Linux進(jìn)程間通信的六種不同方式

Linux進(jìn)程間通信的六種不同方式

發(fā)布人:only1 時(shí)間:2020-09-01 來源:工程師 發(fā)布文章

  今天扣丁學(xué)堂小編給大家整理一下關(guān)于Linux進(jìn)程間通信的六種不同方式的詳解,首先進(jìn)程是操作系統(tǒng)的概念,每當(dāng)我們執(zhí)行一個(gè)程序時(shí),對于操作系統(tǒng)來講就創(chuàng)建了一個(gè)進(jìn)程,在這個(gè)過程中,伴隨著資源的分配和釋放??梢哉J(rèn)為進(jìn)程是一個(gè)程序的一次執(zhí)行過程,下面我們一起來看一下吧。

  進(jìn)程通信的概念


  進(jìn)程用戶空間是相互獨(dú)立的,一般而言是不能相互訪問的。但很多情況下進(jìn)程間需要互相通信,來完成系統(tǒng)的某項(xiàng)功能。進(jìn)程通過與內(nèi)核及其它進(jìn)程之間的互相通信來協(xié)調(diào)它們的行為。


  進(jìn)程通信的應(yīng)用場景


  數(shù)據(jù)傳輸:一個(gè)進(jìn)程需要將它的數(shù)據(jù)發(fā)送給另一個(gè)進(jìn)程,發(fā)送的數(shù)據(jù)量在一個(gè)字節(jié)到幾兆字節(jié)之間。


  共享數(shù)據(jù):多個(gè)進(jìn)程想要操作共享數(shù)據(jù),一個(gè)進(jìn)程對共享數(shù)據(jù)的修改,別的進(jìn)程應(yīng)該立刻看到。


  通知事件:一個(gè)進(jìn)程需要向另一個(gè)或一組進(jìn)程發(fā)送消息,通知它(它們)發(fā)生了某種事件(如進(jìn)程終止時(shí)要通知父進(jìn)程)。


  資源共享:多個(gè)進(jìn)程之間共享同樣的資源。為了作到這一點(diǎn),需要內(nèi)核提供鎖和同步機(jī)制。


  進(jìn)程控制:有些進(jìn)程希望完全控制另一個(gè)進(jìn)程的執(zhí)行(如Debug進(jìn)程),此時(shí)控制進(jìn)程希望能夠****另一個(gè)進(jìn)程的所有陷入和異常,并能夠及時(shí)知道它的狀態(tài)改變。


  進(jìn)程通信的方式


  1、管道


  管道分為有名管道和無名管道無名管道是一種半雙工的通信方式,數(shù)據(jù)只能單向流動,而且只能在具有親緣關(guān)系的進(jìn)程間使用.進(jìn)程的親緣關(guān)系一般指的是父子關(guān)系。無明管道一般用于兩個(gè)不同進(jìn)程之間的通信。當(dāng)一個(gè)進(jìn)程創(chuàng)建了一個(gè)管道,并調(diào)用fork創(chuàng)建自己的一個(gè)子進(jìn)程后,父進(jìn)程關(guān)閉讀管道端,子進(jìn)程關(guān)閉寫管道端,這樣提供了兩個(gè)進(jìn)程之間數(shù)據(jù)流動的一種方式。


  有名管道也是一種半雙工的通信方式,但是它允許無親緣關(guān)系進(jìn)程間的通信。


  2、信號量


  信號量是一個(gè)計(jì)數(shù)器,可以用來控制多個(gè)線程對共享資源的訪問.,它不是用于交換大批數(shù)據(jù),而用于多線程之間的同步.它常作為一種鎖機(jī)制,防止某進(jìn)程在訪問資源時(shí)其它進(jìn)程也訪問該資源.因此,主要作為進(jìn)程間以及同一個(gè)進(jìn)程內(nèi)不同線程之間的同步手段.


  Linux提供了一組精心設(shè)計(jì)的信號量接口來對信號進(jìn)行操作,它們不只是針對二進(jìn)制信號量,下面將會對這些函數(shù)進(jìn)行介紹,但請注意,這些函數(shù)都是用來對成組的信號量值進(jìn)行操作的。它們聲明在頭文件sys/sem.h中。


  semget函數(shù):它的作用是創(chuàng)建一個(gè)新信號量或取得一個(gè)已有信號量


  semop函數(shù):它的作用是改變信號量的值


  semctl函數(shù):該函數(shù)用來直接控制信號量信息


  3、信號


  信號是一種比較復(fù)雜的通信方式,用于通知接收進(jìn)程某個(gè)事件已經(jīng)發(fā)生.


  4、消息隊(duì)列


  消息隊(duì)列是消息的鏈表,存放在內(nèi)核中并由消息隊(duì)列標(biāo)識符標(biāo)識.消息隊(duì)列克服了信號傳遞信息少,管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等特點(diǎn).消息隊(duì)列是UNIX下不同進(jìn)程之間可實(shí)現(xiàn)共享資源的一種機(jī)制,UNIX允許不同進(jìn)程將格式化的數(shù)據(jù)流以消息隊(duì)列形式發(fā)送給任意進(jìn)程.對消息隊(duì)列具有操作權(quán)限的進(jìn)程都可以使用msget完成對消息隊(duì)列的操作控制.通過使用消息類型,進(jìn)程可以按任何順序讀信息,或?yàn)橄才艃?yōu)先級順序.


  5、共享內(nèi)存


  共享內(nèi)存就是映射一段能被其他進(jìn)程所訪問的內(nèi)存,這段共享內(nèi)存由一個(gè)進(jìn)程創(chuàng)建,但多個(gè)進(jìn)程都可以訪問.共享內(nèi)存是最快的IPC(進(jìn)程間通信)方式,它是針對其它進(jìn)程間通信方式運(yùn)行效率低而專門設(shè)計(jì)的.它往往與其他通信機(jī)制,如信號量,配合使用,來實(shí)現(xiàn)進(jìn)程間的同步與通信.


  6、套接字


  socket,即套接字是一種通信機(jī)制,憑借這種機(jī)制,客戶/服務(wù)器(即要進(jìn)行通信的進(jìn)程)系統(tǒng)的開發(fā)工作既可以在本地單機(jī)上進(jìn)行,也可以跨網(wǎng)絡(luò)進(jìn)行。也就是說它可以讓不在同一臺計(jì)算機(jī)但通過網(wǎng)絡(luò)連接計(jì)算機(jī)上的進(jìn)程進(jìn)行通信。也因?yàn)檫@樣,套接字明確地將客戶端和服務(wù)器區(qū)分開來。套接字的特性由3個(gè)屬性確定,它們分別是:域、類型和協(xié)議??捎糜诓煌捌溟g的進(jìn)程通信。


  以上就是關(guān)于扣丁學(xué)堂淺談Linux進(jìn)程間通信的六種不同方式的詳細(xì)介紹,最后扣丁學(xué)堂的Linux培訓(xùn)課程從基礎(chǔ)入門開始教,不論學(xué)員是否擁有基礎(chǔ)在扣丁學(xué)堂都能順利的學(xué)習(xí),扣丁學(xué)堂不僅有專業(yè)的老師和與時(shí)俱進(jìn)的課程體系,還有大量的Linux視頻教程供學(xué)員觀看學(xué)習(xí),想要學(xué)好Linux開發(fā)的小伙伴快快行動吧??鄱W(xué)堂Linux技術(shù)交流群:659974587。

*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。

交換機(jī)相關(guān)文章:交換機(jī)工作原理




關(guān)鍵詞:

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉