• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 基于linux操作系統(tǒng)的進程通信設計

    基于linux操作系統(tǒng)的進程通信設計

    作者: 時間:2012-10-31 來源:網絡 收藏

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

    本文引用地址:http://www.czjhyjcfj.com/article/148287.htm

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

    1)由于Unix版本的多樣性,電子電氣工程協(xié)會(IEEE)開發(fā)了一個獨立的Unix標準,這個新的ANSI Unix標準被稱為計算環(huán)境的可移植性界面(PSOIX)。現(xiàn)有大部分Unix和流行版本都是遵循POSIX標準的,而Linux從一開始就遵循POSIX標準;

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

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

    1.管道

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

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

    #include

    int pipe(int filedis);

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

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

    方式一:mkfifo(myfifo,rw);

    方式二:mknod myfifo p

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

    2.消息隊列

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

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

    3.共享內存

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

    首先要用的函數是shmget,它獲得一個共享存儲標識符。

    #include

    #include

    #include

    int shmget(key_t key, int size, int flag);

    這個函數有點類似大家熟悉的malloc函數,系統(tǒng)按照請求分配size大小的內存用作共享內存。Linux系統(tǒng)內核中每個IPC結構都有的一個非負整數的標識符,這樣對一個消息隊列發(fā)送消息時只要引用標識符就可以了。這個標識符是內核由IPC結構的關鍵字得到的,這個關鍵字,就是上面第一個函數的key。數據類型key_t是在頭文件sys/types.h中定義的,它是一個長整形的數據。在我們后面的章節(jié)中,還會碰到這個關鍵字。

    當共享內存創(chuàng)建后,其余進程可以調用shmat()將其連接到自身的地址空間中。

    void *shmat(int shmid, void *addr, int flag);

    shmid為shmget函數返回的共享存儲標識符,addr和flag參數決定了以什么方式來確定連接的地址,函數的返回值即是該進程數據段所連接的實際地址,進程可以對此進程進行讀寫操作。

    使用共享存儲來實現(xiàn)進程間通信的注意點是對數據存取的同步,必須確保當一個進程去讀取數據時,它所想要的數據已經寫好了。通常,信號量被要來實現(xiàn)對共享存儲數據存取的同步,另外,可以通過使用shmctl函數設置共享存儲內存的某些標志位如SHM_LOCK、SHM_UNLOCK等來實現(xiàn)。

    linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

    上一頁 1 2 下一頁

    評論


    相關推薦

    技術專區(qū)

    關閉
    主站蜘蛛池模板: 锡林浩特市| 康马县| 阳新县| 阿坝县| 岳池县| 井冈山市| 钟祥市| 定南县| 缙云县| 林甸县| 武山县| 新化县| 察哈| 镇远县| 墨玉县| 靖西县| 杂多县| 吉安县| 简阳市| 炎陵县| 瓦房店市| 巴里| 昌图县| 白城市| 庐江县| 正镶白旗| 东兴市| 北辰区| 永新县| 马鞍山市| 甘泉县| 鞍山市| 盘锦市| 玉溪市| 诏安县| 会同县| 永平县| 五大连池市| 新河县| 射阳县| 肥西县|