色偷偷偷亚洲综合网另类,亚洲欧美另类在线观看,欧美午夜激情在线,久久久精品一区

Hi,歡迎來到嵌入式培訓高端品牌 - 華清遠見教育科技集團<北京總部官網>,專注嵌入式工程師培養15年!
當前位置: > 華清遠見教育科技集團 > 嵌入式學習 > 講師博文 > linux下的進程通信
linux下的進程通信
時間:2016-12-29作者:華清遠見

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標準被稱為計算機環境的可移植性操作系統界面(PSOIX),F有大部分Unix和流行版本都是遵循POSIX標準的,而Linux從一開始就遵循POSIX標準;

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

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

1.管道

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

#include <unistd.h>
        int pipe(int filedis[2]);

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

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

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

方式二:mknod myfifo p

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

2.消息隊列

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

3.共享內存

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

#include <sys/types.h> 
        #include <sys/ipc.h> 
        #include <sys/shm.h> 
        int shmget(key_t key, int size, int flag);

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

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

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

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

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

4。信號量

信號量又稱為信號燈,它是用來協調不同進程間的數據對象的,而主要的應用是前一節的共享內存方式的進程間通信。本質上,信號量是一個計數器,它用來記錄對某個資源(如共享內存)的存取狀況。一般說來,為了獲得共享資源,進程需要執行下列操作:

(1) 測試控制該資源的信號量。

(2) 若此信號量的值為正,則允許進行使用該資源。進程將進號量減1。

(3) 若此信號量為0,則該資源目前不可用,進程進入睡眠狀態,直至信號量值大于0,進程被喚醒,轉入步驟(1)。

(4) 當進程不再使用一個信號量控制的資源時,信號量值加1。如果此時有進程正在睡眠等待此信號量,則喚醒此進程。

維護信號量狀態的是Linux內核操作系統而不是用戶進程。我們可以從頭文件/usr/src/linux/include /linux /sem.h中看到內核用來維護信號量狀態的各個結構的定義。信號量是一個數據集合,用戶可以單獨使用這一集合的每個元素。要調用的第一個函數是semget,用以獲得一個信號量ID。

#include <sys/types.h>
        #include <sys/ipc.h>
        #include <sys/sem.h>
        int semget(key_t key, int nsems, int flag);

key是前面講過的IPC結構的關鍵字,它將來決定是創建新的信號量集合,還是引用一個現有的信號量集合。nsems是該集合中的信號量數。如果是創建新集合(一般在服務器中),則必須指定nsems;如果是引用一個現有的信號量集合(一般在客戶機中)則將nsems指定為0。

semctl函數用來對信號量進行操作。

int semctl(int semid, int semnum, int cmd, union semun arg);

不同的操作是通過cmd參數來實現的,在頭文件sem.h中定義了7種不同的操作,實際編程時可以參照使用。

semop函數自動執行信號量集合上的操作數組。

int semop(int semid, struct sembuf semoparray[], size_t nops);

semoparray是一個指針,它指向一個信號量操作數組。nops規定該數組中操作的數量。

下面,我們看一個具體的例子,它創建一個特定的IPC結構的關鍵字和一個信號量,建立此信號量的索引,修改索引指向的信號量的值,后我們清除信號量。

5.套接口

套接口(socket)編程是實現Linux系統和其他大多數操作系統中進程間通信的主要方式之一。我們熟知的WWW服務、FTP服務、TELNET服務等都是基于套接口編程來實現的。除了在異地的計算機進程間以外,套接口同樣適用于本地同一臺計算機內部的進程間通信。

發表評論
評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
色偷偷偷亚洲综合网另类,亚洲欧美另类在线观看,欧美午夜激情在线,久久久精品一区
主站蜘蛛池模板: 国产一区二区日韩| 亚洲午夜小视频| 精品亚洲男同gayvideo网站| 色偷偷9999www| 欧美性在线视频| 精品性高朝久久久久久久| 久久91亚洲人成电影网站| 欧洲成人性视频| 亚洲色图激情小说| 91精品国产色综合久久不卡98| 亚洲国产古装精品网站| 精品久久久久人成| 亚洲一区二区久久久久久| 欧美日韩成人在线视频| 91久久国产综合久久91精品网站| 久久精品成人动漫| 国产免费久久av| 久久99热这里只有精品国产| 国产色视频一区| 欧美日韩亚洲一区二区三区| 日韩电影免费观看在线| 欧美激情一区二区三区成人| 精品视频久久久久久久| 欧美亚洲另类激情另类| 中文字幕在线看视频国产欧美在线看完整| 欧美亚洲一区在线| 日韩性生活视频| 亚洲a级在线观看| 久久久久久一区二区三区 | 久久久久久久久久亚洲| 日韩成人激情视频| 国产精品1234| 狠狠久久五月精品中文字幕| 亚洲男人天堂九九视频| 国产精品一区=区| 欧美丰满少妇xxxxx做受| 亚洲欧美综合精品久久成人| 国产日韩欧美中文在线播放| 午夜精品久久久久久久男人的天堂 | 国产精品亚洲自拍| 性色av一区二区三区红粉影视|