首頁 > 運維 > linux運維 > 主體

經典技巧之Linux進程間通信

WBOY
發布: 2022-02-09 17:38:57
轉載
1908 人瀏覽過

這篇文章為大家帶來了關於linux進程間通訊的相關知識,其中包括管道、匿名管道、共享記憶體等相關問題,希望對大家有幫助。

經典技巧之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

 --操作句柄;失敗回傳-1

       

void *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中文網其他相關文章!

相關標籤:
來源:csdn.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板