這篇文章為大家帶來了關於linux進程間通訊的相關知識,其中包括管道、匿名管道、共享記憶體等相關問題,希望對大家有幫助。
·進程間通訊:#作業系統為系統提供的實作進程間通訊的方式
進程之間是無法直接溝通的,因為每個進程都有獨立的虛擬位址空間,存取的都是自己的虛擬位址,因此進程具有獨立性,無法直接通訊
根據通訊場景的不同,因此提供了多種不同的通訊方式
進程間通訊方式種類:管道、共享記憶體、訊息佇列、訊號量
##·管道
特性:半雙工通訊--可以選擇方向的單向通訊 本質:在核心中開啟一塊緩衝區(核心空間中的一塊記憶體) 原理:多個進程透過存取同一塊核心中的緩衝區實現通訊(複製緩衝區的操作句柄) 分類:匿名管道:緩衝區沒有標識符,只能用於具有親緣關係的進程間通訊 命名管道:緩衝區具有標識符,可用於同一主機上任意的進程間通訊 linux下一切皆檔案--所有東西都是當做檔案同樣進行操作(包括管道),透過IO操作完成對管道的存取·匿名管道
回傳值:成功回傳0;失敗回傳-1 功能:只能用於具有親緣關係的進程間通訊 匿名管道沒有識別符,無法被其他行程找到,只能透過子行程複製父行程的方式取得到操作句柄實現通訊讀寫特性:若管道中沒有數據,read會阻塞
若管道中數據滿了,write會阻塞
所有的管道的讀端關閉,則繼續write則會觸發異常,導致進程崩潰退出
所有的管道的寫端被關閉,則繼續read則會讀取完資料後回傳0,不再阻塞
註:管道是半雙工通信,在通訊時,一旦選定了 方向,應將不使用的那一端關閉。
·
命名管道:#本質是核心中的一塊緩衝區,具有標識符,可以被其他進程找到,因此可用於同一主機上的任意進程間通訊
命名管道的識別碼就是一個可見於檔案系統的管道類型檔案 多個進程透過開啟同一個管道文件,存取同一塊核心中的緩衝區實現通訊 指令操作:mkfifo filename 建立一個命名管道檔案 函數操作:int mkfifo(const char *pathname, mode_t mode) ; pathname:檔案名稱;mode:建立權限 回傳值:成功回傳0;失敗回傳-1##‧總結:
#‧總結:管道的本質:核心空間中的一塊緩衝區 原理:多個進程透過存取同一塊緩衝區來實現資料傳輸 分類:匿名管道、命名管道 ## #### 匿名管道:僅用於具有親緣關係的進程間通訊###### 命名管道:可用於同一主機上任意進程間通訊## --可選擇方向的單向通訊###### 提供位元組串流服務:有序的、可靠的、基於連接的一種串流###### 以連線為基礎:所有讀取端關閉則write異常;所有寫端關閉則read返回0###### ②自帶同步與互斥:###### 同步:透過相同時間進程對臨界資源的唯一存取實現存取安全作業代碼####################################################################################################################################################################################################################' #### 互斥:透過一些條件判斷讓進程對臨界資源的存取更合理有序###互斥的體現:對管道進行寫入操作的大小不超過PIPE_BUF-4096大小,則保證操作的原子性
則write阻塞
③生命週期隨進程:不人為幹預情況下,所有開啟管道的進程退出後,管道緩衝區被釋放
·共享記憶體: 用於實現進程間的資料共享
本質:一塊實體記憶體
原理:開啟一塊實體記憶體空間,多個行程將同一塊對應到自己的虛擬位址空間,透過虛擬位址直接進行訪問,進而實現資料共享
功能:最快的進程間通訊方式,生命週期隨核心
共享記憶體透過虛擬位址直接存取實體內存,實現資料共享,相對於其他方式需要將數據拷貝到內核,使用時拷貝到用戶態,少了兩次資料拷貝操作
注意事項:對共享記憶體的操作需要注意安全性問題
作業流程:
①建立或開啟共享記憶體
②將共享記憶體映射到進程的虛擬位址空間
③透過已對應的虛擬位址進行各種記憶體運算
④ 關聯對應關係式關聯式原則
##int shmget(key_t key, size_t size, int shmflg);
key:識別碼(多個行程透過相同的記憶體識別碼開啟同一塊共享記憶體識別碼size:建立時開啟的空間大小(以記憶體頁為單位)
shmflg:開啟方式 建立權限--IPC_CREAT|IPC_EXCL|0664 --操作句柄;失敗回傳-1void *shmat(int shmid, const void *shmaddr, int shmflg);
## shmid:shmget回傳的操作句柄
o# shmflg:映射成功後的存取方式;SHM_RDONLY-唯讀;0-讀寫
返回值:成功回傳後的首地址返回表示int shmdt(const void *shmaddr);
shmaddr);shmaddr:對應後的首位址 # 回傳值:
0; #int shmctl(int shmid, int cmd, struct shmid_ds *buf);
shmid:shmget回傳的操作句柄## 為被銷毀 buf:對於IPC_RMID,成功回傳0,失敗發送回-1
·訊息佇列
##·訊息佇列
#·訊息佇列
#本質:核心中的一個優先權佇列,多個行程透過存取同一個佇列,為佇列中新增或取得節點而實現行程間的資料區塊傳輸
特性:自帶同步與互斥,生命週期隨核心
#########·信號量############ 本質:核心中的一個計數器pcb等待佇列##### 作用:用於實現進程間的同步與互斥,協調進程對臨界資源的存取###### P操作:計數器-1,判斷若計數小於0則阻塞進程###### V操作:計數器1,喚醒一個阻塞的進程###### 透過自身的計數器對資源進行計數,透過計數判斷進程對資源的取得是否合理,不合理則阻塞。等待產生一個資源之後,喚醒阻塞的程序###### 同步的實現:透過計數器對資源進行計數,在獲取資源之前進行P操作###### 互斥的實現:計數器為1,表示資源只有一個,在進程存取資源之前進行P操作,存取完畢後進行V操作###相關推薦:《Linux影片教學》
以上是經典技巧之Linux進程間通信的詳細內容。更多資訊請關注PHP中文網其他相關文章!