歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> 進程間通信

進程間通信

日期:2017/3/3 11:11:06   编辑:Linux技術

一.管道的基本概念

本質:不同的進程可以看到相同的系統資源

進程退出,管道關閉釋放。

管道實現的原理:

創建子進程的時候子進程會繼承父進程的文件描述符表

特點:

(1)只能實現單向通信

(2)適用於有血緣關系的進程(多用於父子進程)

(3)面向字節流的服務

(4)依賴文件系統

(5)匿名管道

管道是由內核管理的一個緩沖區(buffer),相當於我們放入內存中的一個紙條。管道的一端連接一個進程的輸出。這個進程會向管道中放入信息。管道的另一端連接一個進程的輸入,這個進程取出被放入管道的信息。一個緩沖區不需要很大,它被設計成為環形的數據結構,以便管道可以被循環利用。當管道中沒有信息的話,從管道中讀取的進程會等待,直到另一端的進程放入信息。當管道被放滿信息的時候,嘗試放入信息的進程會等待,直到另一端的進程取出信息。當兩個進程都終結的時候,管道也自動消失。

具體的父子進程間管道的實現:

• 限制管道的大小。實際上,管道是一個固定大小的緩沖區。在Linux

中,該緩沖區的大小為1 頁,即4KB,使得它的大小不像文件那樣不加檢驗地增長。使用單個固定緩沖區也會帶來問題,比如在寫管道時可能變滿,當這種情況發生時,隨後對管道的write()調用將默認地被阻塞,等待某些數據被讀取,以便騰出足夠的空間供write()調用寫。

[align=left]• 讀取進程也可能工作得比寫進程快。當所有當前進程數據已被讀取時,管道變空。當這種情況發生時,一個隨後的read()調用將默認地被阻塞,等待某些數據被寫入,這解決了read()調用返回文件結束的問題。[/align]

注意,從管道讀數據是一次性操作,數據一旦被讀,它就從管道中被拋棄,釋放空間以便寫更多的數據。

結論:

1、頁緩沖區大小:4K

2、總緩沖區大小:64K

讀寫規則:

1、<4K的數據立即發送,以頁為單位

2、>4K的數據,將會分成多個頁的數據,分批發送。

最後,附上我寫的一個簡單的管道:

輸出結果:

Copyright © Linux教程網 All Rights Reserved