進程間交互的幾種方式

進程間通訊就是在不一樣進程之間傳播或交換信息,那麼不一樣進程之間存在着什麼雙方均可以訪問的介質呢?進程的用戶空間是互相獨立的,通常而言是不能互相訪問的,惟一的例外是共享內存區。可是,系統空間倒是「公共場所」,因此內核顯然能夠提供這樣的條件。除此之外,那就是雙方均可以訪問的外設了。在這個意義上,兩個進程固然也能夠經過磁盤上的普通文件交換信息,或者經過「註冊表」或其它數據庫中的某些表項和記錄交換信息。廣義上這也是進程間通訊的手段,可是通常都不把這算做「進程間通訊」。由於那些通訊手段的效率過低了,而人們對進程間通訊的要求是要有必定的實時性。數據庫


進程間通訊主要包括管道, 系統IPC(包括消息隊列,信號量,共享存儲), SOCKET.
管道包括三種:socket

1)普通管道PIPE, 一般有種限制,一是半雙工,只能單向傳輸;二是隻能在父子進程間使用.函數

2)流管道s_pipe: 去除了第一種限制,能夠雙向傳輸. .net

3)命名管道:name_pipe, 去除了第二種限制,能夠在許多並不相關的進程之間進行通信.線程

系統IPC的三種方式類同,都是使用了內核裏的標識符來識別. 設計


管道( pipe ):管道是一種半雙工的通訊方式,數據只能單向流動,並且只能在具備親緣關係的進程間使用。進程的親緣關係一般是指父子進程關係。指針

# 有名管道 (named pipe) : 有名管道也是半雙工的通訊方式,可是它容許無親緣關係進程間的通訊。
# 信號量( semophore ) : 信號量是一個計數器,能夠用來控制多個進程對共享資源的訪問。它常做爲一種鎖機制,防止某進程正在訪問共享資源時,其餘進程也訪問該資源。所以,主要做爲進程間以及同一進程內不一樣線程之間的同步手段。
# 消息隊列( message queue ) : 消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩衝區大小受限等缺點。
# 信號 ( sinal ) : 信號是一種比較複雜的通訊方式,用於通知接收進程某個事件已經發生。
# 共享內存( shared memory ) :共享內存就是映射一段能被其餘進程所訪問的內存,這段共享內存由一個進程建立,但多個進程均可以訪問。共享內存是最快的 IPC 方式,它是針對其餘進程間通訊方式運行效率低而專門設計的。它每每與其餘通訊機制,如信號兩,配合使用,來實現進程間的同步和通訊。
# 套接字( socket ) : 套解口也是一種進程間通訊機制,與其餘通訊機制不一樣的是,它可用於不一樣及其間的進程通訊。blog


FAQ1: 管道與文件描述符,文件指針的關係?
答: 其實管道的使用方法與文件相似,都能使用read,write,open等普通IO函數. 管道描述符來相似於文件描述符. 事實上, 管道使用的描述符, 文件指針和文件描述符最終都會轉化成系統中SOCKET描述符. 都受到系統內核中SOCKET描述符的限制. 本質上LINUX內核源碼中管道是經過空文件來實現.隊列


FAQ2: 管道的使用方法?
答: 主要有下面幾種方法: 1)pipe, 建立一個管道,返回2個管道描述符.一般用於父子進程之間通信. 2)popen, pclose: 這種方式只返回一個管道描述符,經常使用於通訊另外一方是stdin or stdout; 3)mkpipe: 命名管道, 在許多進程之間進行交互.進程


FAQ3: 管道與系統IPC之間的優劣比較?
答: 管道: 優勢是全部的UNIX實現都支持, 而且在最後一個訪問管道的進程終止後,管道就被徹底刪除;缺陷是管道只容許單向傳輸或者用於父子進程之間.
系統IPC: 優勢是功能強大,能在絕不相關進程之間進行通信; 缺陷是關鍵字KEY_T使用了內核標識,佔用了內核資源,並且只能被顯式刪除,並且不能使用SOCKET的一些機制,例如select,epoll等.


FAQ4: WINDOS進程間通訊與LINUX進程間通訊的關係?
答: 事實上,WINDOS的進程通訊大部分移植於UNIX, WINDOS的剪貼板,文件映射等均可從UNIX進程通訊的共享存儲中找到影子.


FAQ5: 進程間通訊與線程間通訊之間的關係?

答: 由於WINDOWS運行的實體是線程, 狹義上的進程間通訊實際上是指分屬於不一樣進程的線程之間的通信.而單個進程之間的線程同步問題可歸併爲一種特殊的進程通訊.它要用到內核支持的系統調用來保持線程之間同步. 一般用到的一些線程同步方法包括:Event, Mutex, 信號量Semaphore, 臨界區資源等.

摘自:http://blog.csdn.net/yufaw/article/details/7409596

相關文章
相關標籤/搜索