歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> Linux業界 >> linux操作系統下的進程通信設計

linux操作系統下的進程通信設計

日期:2017/3/2 13:45:38   编辑:Linux業界

  linux下的進程通信手段基本上是從Unix平台上的進程通信手段繼承而來的。而對Unix發展做出重大貢獻的兩大主力AT&T的貝爾實驗室及BSD(加州大學伯克利分校的伯克利軟件發布中心)在進程間通信方面的側重點有所不同。前者對Unix早期的進程間通信手段進行了系統的改進和擴充,形成了“system V IPC”,通信進程局限在單個計算機內;後者則跳過了該限制,形成了基於套接口(socket)的進程間通信機制。Linux則把兩者繼承了下來,如圖示:

  其中,最初Unix IPC包括:管道、FIFO、信號;System V IPC包括:System V消息隊列、System V信號燈、System V共享內存區;Posix IPC包括:Posix消息隊列、Posix信號燈、Posix共享內存區。有兩點需要簡單說明一下:

  1)由於Unix版本的多樣性,電子電氣工程協會(IEEE)開發了一個獨立的Unix標准,這個新的ANSI Unix標准被稱為計算?肪車目梢浦殘圓僮飨低辰缑妫?SOIX)。現有大部分Unix和流行版本都是遵循POSIX標准的,而Linux從一開始就遵循POSIX標准;

  2)BSD並不是沒有涉足單機內的進程間通信(socket本身就可以用於單機內的進程間通信)。事實上,很多Unix版本的單機IPC留有BSD的痕跡,如4.4BSD支持的匿名內存映射、4.3+BSD對可靠信號語義的實現等等。

  linux下進程間通信的幾種主要手段簡介:

  1.管道

  管道是進程間通信中最古老的方式,它包括無名管道和有名管道兩種,前者可用於具有親緣關系進程間的通信,即可用於父進程和子進程間的通信,後者額克服了管道沒有名字的限制,因此,除具有前者所具有的功能外,它還允許無親緣關系進程間的通信,即可用於運行於同一台機器上的任意兩個進程間的通信。

  無名管道由pipe()函數創建:

  #include

  int pipe(int filedis);

  參數filedis返回兩個文件描述符:filedes[0]為讀而打開,filedes為寫而打開。filedes的輸出是filedes[0]的輸入。

  在Linux系統下,有名管道可由兩種方式創建:命令行方式mknod系統調用和函數mkfifo。下面的兩種途徑都在當前目錄下生成了一個名為myfifo的有名管道:

  方式一:mkfifo("myfifo","rw");

  方式二:mknod myfifo p

  生成了有名管道後,就可以使用一般的文件I/O函數如open、close、read、write等來對它進行操作。

  2.消息隊列

  消息隊列是消息的鏈接表,包括Posix消息隊列system V消息隊列。消息隊列用於運行於同一台機器上的進程間通信,它和管道很相似,有足夠權限的進程可以向隊列中添加消息,被賦予讀權限的進程則可以讀走隊列中的消息。消息隊列克服了信號承載信息量少,管道只能承載無格式字節流以及緩沖區大小受限等缺點。

  我們可以用流管道或者套接口的方式來取代它。

  3.共享內存

  共享內存是運行在同一台機器上的進程間通信最快的方式,因為數據不需要在不同的進程間復制。通常由一個進程創建一塊共享內存區,其余進程對這塊內存區進行讀寫。共享內存往往與其它通信機制,如信號量結合使用,來達到進程間的同步及互斥。

Copyright © Linux教程網 All Rights Reserved