系統(tǒng)之家 - 系統(tǒng)光盤下載網(wǎng)站!

當(dāng)前位置:系統(tǒng)之家 > 系統(tǒng)教程 > 進(jìn)程間通信有哪幾種方式?

進(jìn)程間通信有哪幾種方式?進(jìn)程間通信的方法詳解

時(shí)間:2017-10-24 14:52:24 作者:chunhua 來(lái)源:系統(tǒng)之家 1. 掃描二維碼隨時(shí)看資訊 2. 請(qǐng)使用手機(jī)瀏覽器訪問(wèn): https://m.xitongzhijia.net/xtjc/20171024/109869.html 手機(jī)查看 評(píng)論

  進(jìn)程間通信有哪幾種方式?不同進(jìn)程之間是會(huì)進(jìn)行相互傳播或交換信息的,很多伙伴都很好奇,各進(jìn)程之間是通過(guò)什么介質(zhì)進(jìn)行通信的呢?今天小編就給大家科普下進(jìn)程間通信的方法。

進(jìn)程間通信有哪幾種方式?進(jìn)程間通信的方法詳解

前言:

  進(jìn)程間通信(IPC,Interprocess communication)是一組編程接口,讓程序員能夠協(xié)調(diào)不同的進(jìn)程,使之能在一個(gè)操作系統(tǒng)里同時(shí)運(yùn)行,并相互傳遞、交換信息。這使得一個(gè)程序能夠在同一時(shí)間里處理許多用戶的要求。因?yàn)榧词怪挥幸粋(gè)用戶發(fā)出要求,也可能導(dǎo)致一個(gè)操作系統(tǒng)中多個(gè)進(jìn)程的運(yùn)行,進(jìn)程之間必須互相通話。IPC接口就提供了這種可能性。每個(gè)IPC方法均有它自己的優(yōu)點(diǎn)和局限性,一般,對(duì)于單個(gè)程序而言使用所有的IPC方法是不常見(jiàn)的。

進(jìn)程間通信的8種方法:

  1、無(wú)名管道通信

  無(wú)名管道( pipe ):管道是一種半雙工的通信方式,數(shù)據(jù)只能單向流動(dòng),而且只能在具有親緣關(guān)系的進(jìn)程間使用。進(jìn)程的親緣關(guān)系通常是指父子進(jìn)程關(guān)系。

  2、高級(jí)管道通信

  高級(jí)管道(popen):將另一個(gè)程序當(dāng)做一個(gè)新的進(jìn)程在當(dāng)前程序進(jìn)程中啟動(dòng),則它算是當(dāng)前程序的子進(jìn)程,這種方式我們成為高級(jí)管道方式。

  3、有名管道通信

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

  4、消息隊(duì)列通信

  消息隊(duì)列( message queue ) : 消息隊(duì)列是由消息的鏈表,存放在內(nèi)核中并由消息隊(duì)列標(biāo)識(shí)符標(biāo)識(shí)。消息隊(duì)列克服了信號(hào)傳遞信息少、管道只能承載無(wú)格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)。

  5、信號(hào)量通信

  信號(hào)量( semophore ) : 信號(hào)量是一個(gè)計(jì)數(shù)器,可以用來(lái)控制多個(gè)進(jìn)程對(duì)共享資源的訪問(wèn)。它常作為一種鎖機(jī)制,防止某進(jìn)程正在訪問(wèn)共享資源時(shí),其他進(jìn)程也訪問(wèn)該資源。因此,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線程之間的同步手段。

  6、信號(hào)

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

  7、共享內(nèi)存通信

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

  8、套接字通信

  套接字( socket ) : 套接口也是一種進(jìn)程間通信機(jī)制,與其他通信機(jī)制不同的是,它可用于不同機(jī)器間的進(jìn)程通信。

  之前寫過(guò)一個(gè)課程設(shè)計(jì):基于Internet的Linux客戶機(jī)/服務(wù)器系統(tǒng)通訊設(shè)計(jì)與實(shí)現(xiàn)

  是利用sock通信實(shí)現(xiàn)的,可以參考一下。

  通信過(guò)程如下:

  8.1命名socket

  SOCK_STREAM 式本地套接字的通信雙方均需要具有本地地址,其中服務(wù)器端的本地地址需要明確指定,指定方法是使用 struct sockaddr_un 類型的變量。

  8.2 綁定

  SOCK_STREAM 式本地套接字的通信雙方均需要具有本地地址,其中服務(wù)器端的本地地址需要明確指定,指定方法是使用 struct sockaddr_un 類型的變量,將相應(yīng)字段賦值,再將其綁定在創(chuàng)建的服務(wù)器套接字上,綁定要使用 bind 系統(tǒng)調(diào)用,其原形如下:

  1. 01int bind(int socket, const struct sockaddr *address, size_t address_len);
復(fù)制代碼
int bind(int socket, const struct sockaddr *address, size_t address_len);

  其中 socket表示服務(wù)器端的套接字描述符,address 表示需要綁定的本地地址,是一個(gè) struct sockaddr_un 類型的變量,address_len 表示該本地地址的字節(jié)長(zhǎng)度。

  8.3 監(jiān)聽(tīng)

  服務(wù)器端套接字創(chuàng)建完畢并賦予本地地址值(名稱,本例中為Server Socket)后,需要進(jìn)行監(jiān)聽(tīng),等待客戶端連接并處理請(qǐng)求,監(jiān)聽(tīng)使用 listen 系統(tǒng)調(diào)用,接受客戶端連接使用accept系統(tǒng)調(diào)用,它們的原形如下:

  1. 01int listen(int socket, int backlog);
  2. 02int accept(int socket, struct sockaddr *address, size_t *address_len);
復(fù)制代碼
int listen(int socket, int backlog); int accept(int socket, struct sockaddr *address, size_t *address_len);

  其中 socket 表示服務(wù)器端的套接字描述符;backlog 表示排隊(duì)連接隊(duì)列的長(zhǎng)度(若有多個(gè)客戶端同時(shí)連接,則需要進(jìn)行排隊(duì));address 表示當(dāng)前連接客戶端的本地地址,該參數(shù)為輸出參數(shù),是客戶端傳遞過(guò)來(lái)的關(guān)于自身的信息;address_len 表示當(dāng)前連接客戶端本地地址的字節(jié)長(zhǎng)度,這個(gè)參數(shù)既是輸入?yún)?shù),又是輸出參數(shù)。

  8.4 連接服務(wù)器

  客戶端套接字創(chuàng)建完畢并賦予本地地址值后,需要連接到服務(wù)器端進(jìn)行通信,讓服務(wù)器端為其提供處理服務(wù)。

  對(duì)于SOCK_STREAM類型的流式套接字,需要客戶端與服務(wù)器之間進(jìn)行連接方可使用。連接要使用 connect 系統(tǒng)調(diào)用,其原形為

  1. 01int connect(int socket, const struct sockaddr *address, size_t address_len);
復(fù)制代碼
int connect(int socket, const struct sockaddr *address, size_t address_len);

  其中socket為客戶端的套接字描述符,address表示當(dāng)前客戶端的本地地址,是一個(gè) struct sockaddr_un 類型的變量,address_len 表示本地地址的字節(jié)長(zhǎng)度。實(shí)現(xiàn)連接的代碼如下:

  1. 01connect(client_sockfd, (struct sockaddr*)&client_address, sizeof(client_address));
復(fù)制代碼
connect(client_sockfd, (struct sockaddr*)&client_address, sizeof(client_address));

  8.5 相互發(fā)送接收數(shù)據(jù)

  無(wú)論客戶端還是服務(wù)器,都要和對(duì)方進(jìn)行數(shù)據(jù)上的交互,這種交互也正是我們進(jìn)程通信的主題。一個(gè)進(jìn)程扮演客戶端的角色,另外一個(gè)進(jìn)程扮演服務(wù)器的角色,兩個(gè)進(jìn)程之間相互發(fā)送接收數(shù)據(jù),這就是基于本地套接字的進(jìn)程通信。發(fā)送和接收數(shù)據(jù)要使用 write 和 read 系統(tǒng)調(diào)用,它們的原形為:

  1. 01int read(int socket, char *buffer, size_t len);
  2. 02int write(int socket, char *buffer, size_t len);
復(fù)制代碼
int read(int socket, char *buffer, size_t len); int write(int socket, char *buffer, size_t len);

  其中 socket 為套接字描述符;len 為需要發(fā)送或需要接收的數(shù)據(jù)長(zhǎng)度;

  對(duì)于 read 系統(tǒng)調(diào)用,buffer 是用來(lái)存放接收數(shù)據(jù)的緩沖區(qū),即接收來(lái)的數(shù)據(jù)存入其中,是一個(gè)輸出參數(shù);

  對(duì)于 write 系統(tǒng)調(diào)用,buffer 用來(lái)存放需要發(fā)送出去的數(shù)據(jù),即 buffer 內(nèi)的數(shù)據(jù)被發(fā)送出去,是一個(gè)輸入?yún)?shù);返回值為已經(jīng)發(fā)送或接收的數(shù)據(jù)長(zhǎng)度。

  8.6 斷開(kāi)連接

  交互完成后,需要將連接斷開(kāi)以節(jié)省資源,使用close系統(tǒng)調(diào)用,其原形為:

  1. 01int close(int socket);
復(fù)制代碼
int close(int socket);

  關(guān)于進(jìn)程間通信的方法就給大家講解到這里了,對(duì)于進(jìn)程充滿好奇心的伙伴,可以仔細(xì)看看小編整理的以上內(nèi)容哦!

發(fā)表評(píng)論

0

沒(méi)有更多評(píng)論了

評(píng)論就這些咯,讓大家也知道你的獨(dú)特見(jiàn)解

立即評(píng)論

以上留言僅代表用戶個(gè)人觀點(diǎn),不代表系統(tǒng)之家立場(chǎng)

其他版本軟件

人氣教程排行

相關(guān)系統(tǒng)推薦

官方交流群 軟件收錄