創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買多久送多久,劃算不套路!

linux有幾種方式實(shí)現(xiàn)進(jìn)程間通信?針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
進(jìn)程概念:
進(jìn)程是操作系統(tǒng)的概念,每當(dāng)我們執(zhí)行一個(gè)程序時(shí),對(duì)于操作系統(tǒng)來(lái)講就創(chuàng)建了一個(gè)進(jìn)程,在這個(gè)過(guò)程中,伴隨著資源的分配和釋放。可以認(rèn)為進(jìn)程是一個(gè)程序的一次執(zhí)行過(guò)程。
進(jìn)程通信概念:
進(jìn)程用戶空間是相互獨(dú)立的,一般而言是不能相互訪問(wèn)的。但很多情況下進(jìn)程間需要互相通信,來(lái)完成系統(tǒng)的某項(xiàng)功能。進(jìn)程通過(guò)與內(nèi)核及其它進(jìn)程之間的互相通信來(lái)協(xié)調(diào)它們的行為。
linux進(jìn)程間通信的方式:
Linux進(jìn)程間基本的通信方式主要有:管道(pipe)(包括匿名管道和命名管道)、信號(hào)(signal)、消息隊(duì)列(queue)、共享內(nèi)存、信號(hào)量和套接字。
下面分別介紹一下這幾種方式:
1、管道
管道的實(shí)質(zhì)是一個(gè)內(nèi)核緩沖區(qū),管道的作用正如其名,需要通信的兩個(gè)進(jìn)程在管道的兩端,進(jìn)程利用管道傳遞信息。管道對(duì)于管道兩端的進(jìn)程而言,就是一個(gè)文件,但是這個(gè)文件比較特殊,它不屬于文件系統(tǒng)并且只存在于內(nèi)存中。
2、信號(hào)
信號(hào)是軟件層次上對(duì)中斷機(jī)制的一種模擬,是一種異步通信方式,進(jìn)程不必通過(guò)任何操作來(lái)等待信號(hào)的到達(dá)。信號(hào)可以在用戶空間進(jìn)程和內(nèi)核之間直接交互,內(nèi)核可以利用信號(hào)來(lái)通知用戶空間的進(jìn)程發(fā)生了哪些系統(tǒng)事件。
3、消息隊(duì)列
消息隊(duì)列是消息的鏈表,具有特定的格式,存放在內(nèi)存中并由消息隊(duì)列標(biāo)識(shí)符標(biāo)識(shí),并且允許一個(gè)或多個(gè)進(jìn)程向它寫入與讀取消息
4、共享內(nèi)存
使得多個(gè)進(jìn)程可以可以直接讀寫同一塊內(nèi)存空間,是針對(duì)其他通信機(jī)制運(yùn)行效率較低而設(shè)計(jì)的。
為了在多個(gè)進(jìn)程間交換信息,內(nèi)核專門留出了一塊內(nèi)存區(qū),可以由需要訪問(wèn)的進(jìn)程將其映射到自己的私有地址空間。進(jìn)程就可以直接讀寫這一塊內(nèi)存而不需要進(jìn)行數(shù)據(jù)的拷貝,從而大大提高效率。
注意:共享內(nèi)存并未提供同步機(jī)制,在一個(gè)進(jìn)程結(jié)束對(duì)共享內(nèi)存的寫操作之前,并無(wú)自動(dòng)機(jī)制可以阻止另二個(gè)進(jìn)程開(kāi)始對(duì)它進(jìn)行讀取。所以,我們通常需要用其他的機(jī)制來(lái)同步對(duì)共享內(nèi)存的訪問(wèn)。
5、信號(hào)量
信號(hào)量實(shí)質(zhì)上就是一個(gè)標(biāo)識(shí)可用資源數(shù)量的計(jì)數(shù)器,它的值總是非負(fù)整數(shù)。而只有0和1兩種取值的信號(hào)量叫做二進(jìn)制信號(hào)量(或二值信號(hào)量),可用用來(lái)標(biāo)識(shí)某個(gè)資源是否可用。
6、套接字
套接字是更為基礎(chǔ)的進(jìn)程間通信機(jī)制,與其他方式不同的是,套接字可用于不同機(jī)器之間的進(jìn)程間通信。
有兩種類型的套接字:基于文件的和面向網(wǎng)絡(luò)的。
(1)Unix套接字是基于文件的,并且擁有一個(gè)“家族名字”--AF_UNIX,它代表地址家族(address family):UNIX。
(2)第二類型的套接字是基于網(wǎng)絡(luò)的,它也有自己的家族名字--AF_INET,代表地址家族(address family):INTERNET
不管采用哪種地址家族,都有兩種不同的套接字連接:面向連接的和無(wú)連接的。
(1)面向連接的套接字(SOCK_STREAM)
進(jìn)行通信前必須建立一個(gè)連接,面向連接的通信提供序列化的、可靠地和不重復(fù)的數(shù)據(jù)交付,而沒(méi)有記錄邊界。
這意味著每條信息可以被拆分成多個(gè)片段,并且每個(gè)片段都能確保到達(dá)目的地,然后在目的地將信息拼接起來(lái)。
實(shí)現(xiàn)這種連接類型的主要協(xié)議是傳輸控制協(xié)議(TCP)。
(2)無(wú)連接的套接字(SOCK_DGRAM)
在通信開(kāi)始之前并不需要建立連接,在數(shù)據(jù)傳輸過(guò)程中并無(wú)法保證它的順序性、可靠性或重復(fù)性。
然而,數(shù)據(jù)報(bào)確實(shí)保存了記錄邊界,這就意味著消息是以整體發(fā)送的,而并非首先分成多個(gè)片段。
由于面向連接的套接字所提供的保證,因此它們的設(shè)置以及對(duì)虛擬電路連接的維護(hù)需要大量的開(kāi)銷。然而,數(shù)據(jù)報(bào)不需要這些開(kāi)銷,即它的成本更加“低廉”。
實(shí)現(xiàn)這種連接類型的主要協(xié)議是用戶數(shù)據(jù)報(bào)協(xié)議(UDP)。
應(yīng)用場(chǎ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)程對(duì)共享數(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)改變。
關(guān)于linux有幾種方式實(shí)現(xiàn)進(jìn)程間通信問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
網(wǎng)站名稱:linux有幾種方式實(shí)現(xiàn)進(jìn)程間通信-創(chuàng)新互聯(lián)
本文URL:http://chinadenli.net/article48/hjsep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、網(wǎng)站內(nèi)鏈、網(wǎng)站策劃、微信公眾號(hào)、電子商務(wù)、網(wǎng)頁(yè)設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容