在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

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

            基于linux操作系統(tǒng)的進(jìn)程通信設(shè)計

            作者: 時間:2012-10-31 來源:網(wǎng)絡(luò) 收藏

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

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

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

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

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

            下進(jìn)程間通信的幾種主要手段簡介:

            1.管道

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

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

            #include

            int pipe(int filedis);

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

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

            方式一:mkfifo(myfifo,rw);

            方式二:mknod myfifo p

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

            2.消息隊列

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

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

            3.共享內(nèi)存

            共享內(nèi)存是運(yùn)行在同一臺機(jī)器上的進(jìn)程間通信最快的方式,因?yàn)閿?shù)據(jù)不需要在不同的進(jìn)程間復(fù)制。通常由一個進(jìn)程創(chuàng)建一塊共享內(nèi)存區(qū),其余進(jìn)程對這塊內(nèi)存區(qū)進(jìn)行讀寫。共享內(nèi)存往往與其它通信機(jī)制,如信號量結(jié)合使用,來達(dá)到進(jìn)程間的同步及互斥。

            首先要用的函數(shù)是shmget,它獲得一個共享存儲標(biāo)識符。

            #include

            #include

            #include

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

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

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

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

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

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

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

            上一頁 1 2 下一頁

            評論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉